2012-12-29 123 views
2

可能重複:
Secure hash and salt for PHP passwords是精細哈希(密碼+鹽)

假設鹽是S隨機的,高熵的長字符串,和散列sha512bcrypt爲什麼hash(password + perUserSalt)認爲不夠?

這個問題起源閱讀後的PHP的新password hashing API RFC中,作者指出,

哈希(密碼+鹽)=它

+0

我聽說過類似的聲明,所以我一直使用'hmac_hash()'。不知道哪一個更好說實話:S – sourRaspberri

+0

這個問題很直接。爲什麼作者考慮'散列(pw,salt)'不好。引用的問題沒有回答。 – Alex

+0

因爲'sha512'的計算速度非常快。您是否閱讀過該wiki頁面的參考資料部分?它在那裏。 –

回答

0

很多年前,這是通常的哈希密碼不罰款像這樣保存在數據庫中,例如:

$hashedPassword = MD5($password . $salt); 

硬件變得越來越快,和已知的快速散列函數像MD5,SHA-1,而且SHA-512可能會被蠻力推得太快。如今[2012]有可能使用通用硬件來計算約8 Giga MD5 values,用500'000個單詞對整個英文字典進行蠻力操作,只需要幾分之一毫秒!

這就是爲什麼像BCrypt和PBKDF2這樣的密鑰派生函數發明的原因。他們有一個成本參數並重復多次哈希(成本因素決定了迭代次數)。 每次迭代將使用原始的鹽來計算新的哈希值,這就是爲什麼你必須單獨鹽遞過來的功能和之前不能連接它:

$hashedPassword = Bcrypt($password, $salt); 

鏈接的文章或者想解釋現在單個散列計算是不夠的,或者它希望顯示在將密鑰傳遞給散列函數之前,salt不能與密碼連接。

+0

感謝您的回答。應該用''替換'+','。無論如何,如果散列函數是'sha512',你的答案會如何改變。爲什麼它被認爲不夠安全? – Alex

+0

@Alex - 爲未來的讀者重寫了答案。 – martinstoeckli