2012-07-24 120 views
1

所以,安全密碼存儲和恢復

我有存儲密碼一個MySQL表,而這些密碼不能被散列,因爲我需要後來把它恢復爲純文本。

我有一個javascript,它通過ajax/php從一個mysql數據庫中取得這些密碼,並將它發送給另一個服務器,它將使用它進行身份驗證,這就是爲什麼當我發送時我需要以純文本形式存在它們。

我知道有base64和其他加密alghorythms,但這是不安全的。

我發現的最好的解決方案是OpenSSL,但我不確定我是否在正確的道路上。我是嗎?

+0

另一種選擇:不要依賴客戶端發送明文密碼 - 讓第一個服務器發起請求到第二個服務器。 – nickb 2012-07-24 21:41:08

+1

Base64!=加密。 – 2012-07-24 21:42:06

+0

他們爲什麼不能被哈希?通常密碼系統對密碼進行散列,然後使用輸入的文本(通常是密碼)並對其進行散列並檢查散列值是否相互匹配。 – MasterGberry 2012-07-24 21:44:19

回答

0

我會強烈建議您不要以明文存儲密碼,並可能會生成某種從一臺服務器傳遞到另一臺服務器的一次性使用密鑰。

因此,服務器之一有一個鏈接到一個特定的用戶是唯一的,這個密鑰也在服務器二上,這是通過的關鍵。

3

OpenSSL是一個開始尋找的好地方。它支持大量可用於加密純文本密碼的安全加密算法。 AES-256或Twofish是開始查看的好算法。 3DES對於今天的標準也被認爲是足夠的。

爲了更好的安全性,您需要使用不同的密鑰加密每個用戶的密碼;也就是說,每個用戶都有一個唯一的加密密鑰,並且您不會對所有密碼使用1個密鑰。這可能是他們在您的網站上使用的用戶密碼的散列,但通常用戶密碼不夠強大,並且如果他們忘記了您的網站/服務的密碼,那麼他們也會丟失加密密鑰。

爲了最大的安全性,您不應該在任何地方存儲加密密鑰。用戶使用其密碼登錄時,可以根據密碼在內存中生成加密密鑰。理想情況下,它不僅僅是他們密碼的哈希,而是通過某種轉換算法應用他們的密碼。

如果這不是一個選項,那麼您應該將加密密鑰存儲在與存儲加密用戶密碼的物理服務器不同的物理服務器上。存儲加密密鑰的服務器應具有許多安全和訪問控制功能,並且具有非常受控制的數據庫訪問權限,因此幾乎只有您的應用程序才能訪問密鑰。

最重要的是,您必須在您的隱私政策中披露,您可能會存儲加密的密碼形式以用於第三方服務。

希望有所幫助。 OWASP可能還有其他一些有用的信息與您要做什麼有關。

2

感謝所有的答案,我要使用這裏描述的PHP encryptation方法:https://stackoverflow.com/a/6639179/1415262

,並嘗試一些OpenSSL的。

對於所有其他答案,我有幾個問題,他們很短的時間來解釋爲什麼。

PS。:我還沒有投票,但特別感謝@ drew010和@fabio :)