2012-11-21 88 views
4

我目前正在計劃開發一個PHP應用程序,該應用程序需要存儲用於外部服務的用戶密碼,以便在用戶登錄到我的應用程序時可以同時登錄。PHP - 安全地存儲外部服務的密碼?

我需要以安全的方式存儲密碼,即不是純文本,而不是base64編碼,但也需要應用程序以純文本方式訪問密碼,這種或那種方式。

我只能夠想到的東西像下面這樣:

當用戶添加自己的憑據,外部服務到他們的帳戶,他們爲我的應用程序重新輸入自己的密碼,並且(在加密的形式)用於以某種方式'加密'外部服務的密碼,但以一種使其仍然可訪問的方式。

有沒有人有任何想法,如果這是可能的,或潛在的解決方案?

感謝

此外:這是值得注意的是,這將是一個SSL連接數據被髮送過來。

出於好奇:說例如; Google Mail,您可以將電子郵件帳戶添加到您的Google Mail帳戶,以便對其進行檢查。有沒有人對Google如何存儲您添加的帳戶密碼有任何想法?

+0

你最初接受的憑證? –

+0

是的,用於外部服務的憑證最初將在用戶將其添加到我的應用程序的帳戶時輸入。 – Seer

+0

用戶使用外部密碼登錄到您的應用程序?或從您的應用程序密碼? –

回答

5

這個問題一般來說就是,如果你的系統每次都受到攻擊,攻擊者可以獲得所有系統的所有密碼,因爲它們是加密的而不是散列的。沒有辦法解決這個問題,因爲你希望能夠獲得純文本密碼。

如果你必須這樣做,你可以使用像OpenSSL一樣可靠的東西來加密密碼。

+0

對此+1,md5和sha1不加密數據,他們散列它。 –

1

那麼,你可以用用戶自己的密碼加密密碼(不要存儲在任何地方),每次進行通訊時都要問這個密碼,這樣密碼可能是安全的。

+0

這是你的意思,他們會每次輸入我的應用程序的密碼或外部服務? – Seer

+0

適合您的應用。他們的密碼是用於加密/解密外部服務密碼的密鑰。但是如果用戶忘記密碼,所有加密的密碼將會丟失。 –

+0

好吧,說會有一個'忘記密碼'功能。這意味着需要重新輸入其外部帳戶的所有密碼,然後使用新密碼作爲密鑰進行重新加密,這同樣適用於用戶是否要更改我想的密碼。 – Seer

0

您可以使用php mcrypt,查看相關問題here。或者,如果您更喜歡加密/解密服務器端,mySQL具有AES加密功能。

2

從證券的角度來看,您真的不應該在任何地方存儲密碼。我會讓用戶輸入他們的密碼md5他們的密碼並存儲。所以當他認證它的認證與MD5。至於外部。您可以使用存儲的md5取外部密碼和XOR外部密碼。這樣你可以撤消它將它傳遞給外部源。或者更好的辦法是每次爲外部請求密碼。這是風險與便利的選擇。

+0

我的應用程序的密碼將被存儲使用(最有可能的)blowfish加密。這當然可以很容易地檢查,這是我猜的。你的答案的總體思路是我在想什麼,不知怎的,用戶的密碼用於我的服務,用於'撤消'加密外部服務的密碼。 – Seer

1

GAH ......我希望大家都只是規範上的按鍵:

<?php 
$connection = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa')); 

$sth = $dbh->prepare('select keyLoc from auth where username = :user'); 
$sth->bind_param('user', 'username'); 
$key = $sth->fetch(PDO::FETCH_ASSOC); 

if (ssh2_auth_pubkey_file($connection, 'username', 
         $key, 
         '/home/username/.ssh/id_rsa', 'secret')) { 
    echo "Public Key Authentication Successful\n"; 
} else { 
    die('Public Key Authentication Failed'); 
} 
?> 

它將使生活變得更輕鬆。只需將您的公鑰複製到任意位置,並將私鑰保存在您的身上。

1

你應該做的就是使用Oauth - 當它正確實現時更安全,也更加用戶友好。

Zend oauht client

0

您可以使用這樣的PKIF(特別PKIFCRYPTO)和NSSMS-CAPI。這不是因爲內心的虛弱,而是你想要向決定信任你的用戶展示一定程度的能力。