我試圖創建一個實現PBKDF2來生成一個密鑰來加密AES-256文件,但我有一個關於鹽大小的問題。我計劃使用SHA-256並與密碼連接,所以如果連接比特串的大小大於256比特,它會有所作爲,或者如果salt和密碼短語每個都是256比特,它會被認爲更安全,使他們的串聯512位?哈希函數中的比特串的大小是多少?
回答
首先,讓我們備份和快速審查PBKDF2:
PBKDF2產生的輸出是字節所需數量的長。它通過計算一些'塊'來產生這些字節。每個塊都是所選散列的大小。例如,如果您希望派生一個長度爲64字節的密鑰,並且您希望使用產生32字節散列的SHA-256,則將生成2個PBKDF2塊。最終的輸出是這些塊的連接。
那麼如何生成每個塊?那麼,(我將在這裏使用RFC命名法),塊是由一個函數F
生成的。此功能需要輸入用戶密碼P
,您的鹽S
,期望的迭代次數c
以及您正在生成的塊的索引i
(one-based)。
爲了您的第一個塊,你的函數調用將類似於:(注意:我使用的是100K的迭代有關選擇此值的詳細信息,請參閱this post。)F ("MySecretPassword", "random_salt", 100000, 1)
返回參考RFC:
F(P, S, c, i) = U_1 \xor U_2 \xor U_3 ... U_c
U_1 = PRF(P, S || INT(i))
U_2 = PRF(P, U_1)
U_3 = PRF(P, U_2)
...
U_c = PRF(P, U_{c-1})
PRF
代表僞隨機函數。其中,對於SHA-256應該是基於SHA-256的HMAC。該功能通過首先爲您的密碼P
生成SHA-256 HMAC,使用您的salt S
連接到塊號i
。然後,該函數迭代(c
次),並將結果與先前的結果進行異或運算。每次迭代使用SHA-256 HMAC(再次)散列密碼P
,但將先前結果用作HMAC密鑰。
所以 - 回到你的問題 - 因爲我們使用HMAC,鹽長度無關緊要,可以超過256位。當HMAC提供的密鑰(在這種情況下,您的密碼)長於散列輸出的長度時,它將散列密鑰以獲得完全256位。如果提供的密鑰長度小於256位,則會填充256位。從某種意義上說,這些細節對於你的實現是隱藏的,所以你不必擔心你傳遞給PBKDF2的鹽有多久。
**好吧,它確實在一定程度上。請參閱owlstead對其他答案的評論。它應該足夠長,以阻止使用彩虹桌。 (儘管由於PBKDF2應用了很多次哈希函數,長鹽不如傳統的「直接哈希」應用程序重要)。對於我的應用程序,我使用32字節的隨機salt,對於每個用戶帳戶都是唯一的用PBKDF2散列密碼。
希望有幫助!
- 1. 哈希字符串大小
- 2. 什麼是MongoDB哈希的大小?
- 3. 用於比較的哈希函數
- 4. 什麼是杜鵑哈希中的「新哈希函數」?
- 5. 哈希集效果表現中的項目數量是多少?
- 6. 如何在Ruby中創建比較字符串的哈希,忽略大小寫?
- 7. 哈希函數和表格的大小表格2^p
- 8. OCaml中函數堆棧的大小是多少?
- 9. char []的大小是多少?
- 10. RLMInt的大小是多少?
- 11. 哈希表混亂 - 哈希表需要多少空間才能獲得良好(例如加密)哈希函數?
- 12. Perl哈希陣列大小
- 13. 哈希表大小設置
- 14. 與其原始大小相比,字符打包整數的大小是多少?
- 15. Google Apps腳本中字符串的最大大小是多少?
- 16. (比特幣)從網絡函數計算哈希值 - 怎麼做?
- 17. Python哈希函數和哈希對象
- 18. ActiveRecord的測試大/小比哈希條件內
- 19. 最小完美哈希函數
- 20. 簡單的哈希函數,它是HTML id友好和區分大小寫
- 21. 哈希函數的改進
- 22. 完美的哈希函數
- 23. 哈希函數的確定
- 24. 相同的哈希函數
- 25. 與Glibc的哈希函數
- 26. SHA512哈希算法的密鑰大小
- 27. 哈希克爾的樹大小
- 28. Linux中Ready Queue的大小是多少?
- 29. Hyperledger v0.6中塊的大小是多少?
- 30. Java中Character(char)的大小是多少?
爲什麼在一個標準的哈希上需要HMAC哈希?爲什麼使用先前的結果作爲密碼的簡單鹽而不是將它用作HMAC功能的密鑰是安全的? –
+1,只是一件小事,再一次PKCS#5:「僞隨機函數PRF的第一個參數作爲HMAC的」鍵「,第二個作爲HMAC的」文本「。在PBKDF2的情況下,」鍵「因此是密碼,「文本」是鹽。「 – emboss
@emboss - 啊,你是正確的先生,我已經更新了上面的文字。 – Tails