2011-07-13 63 views
2

我試圖創建一個實現PBKDF2來生成一個密鑰來加密AES-256文件,但我有一個關於鹽大小的問題。我計劃使用SHA-256並與密碼連接,所以如果連接比特串的大小大於256比特,它會有所作爲,或者如果salt和密碼短語每個都是256比特,它會被認爲更安全,使他們的串聯512位?哈希函數中的比特串的大小是多少?

回答

1

首先,讓我們備份和快速審查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散列密碼。

希望有幫助!

+0

爲什麼在一個標準的哈希上需要HMAC哈希?爲什麼使用先前的結果作爲密碼的簡單鹽而不是將它用作HMAC功能的密鑰是安全的? –

+0

+1,只是一件小事,再一次PKCS#5:「僞隨機函數PRF的第一個參數作爲HMAC的」鍵「,第二個作爲HMAC的」文本「。在PBKDF2的情況下,」鍵「因此是密碼,「文本」是鹽。「 – emboss

+0

@emboss - 啊,你是正確的先生,我已經更新了上面的文字。 – Tails