2010-04-21 66 views
0

我正在設計一個Web應用程序,該程序需要以加密格式在數據庫中存儲GPG密鑰。在不降低密碼安全性的情況下使用密碼生成兩個不同的哈希

我打算將用戶的密碼存儲在數據庫的bCrypt哈希中。我希望能夠做的是使用該bCrypt來認證用戶,然後使用存儲的bCrypt散列和另一個密碼散列的組合來加密和解密GPG密鑰。

我的問題是我是否可以在不降低密碼安全性的情況下做到這一點?我認爲我可以使用密碼和鹽作爲密鑰的靜態字符串的HMAC-SHA256。

有沒有更好的方式來做到這一點,我沒有想到?

感謝

回答

0

如果你總是要解密GPG密鑰,那麼你可以保持與密鑰加密的已知值並用它來驗證用戶密碼(即,如果正確的用戶密碼已輸入,然後解密的GPG密鑰將把存儲的數據解密爲已知值)。

使用標準密鑰派生算法從密碼生成密鑰,您的加密庫應該包含一個。

+0

編輯:我想知道你的答案在第一,第二,閱讀。這可能會起作用,儘管每次用戶嘗試登錄時都需要更多的CPU負載來嘗試解密兩個項目。 – Nevins 2010-04-21 21:23:04

2

考慮使用PBKDF2(來自PKCS #5)。它需要輸入密碼,鹽和迭代計數。迭代計數指定密碼應重複散列的次數;使用大數(1000到10000是常見的)有助於使密碼猜測攻擊更難。鹽導致相同密碼的不同用途創建不同的密鑰。

由於PBKDF2的設計,即使您知道由不同鹽的相同密碼生成的哈希值,也很難猜測用一個鹽生成的哈希值。

PBKDF2已經實現並且可以在大多數任何加密庫中使用。例如,它可以在OpenSSL中使用PKCS5_PBKDF2_HMAC_SHA1(標題evp.h)。