KDF後跟一個雜湊?
我的理解是 KDF 會增加熵,而雜湊會失去資訊。
我讀過 KDF 應該用於儲存密碼。我不明白為什麼我們不使用 KDF,然後使用雜湊,這樣——如果密碼數據庫洩露——也無法找出普通密碼。
所以在數據庫中儲存密碼應該是這樣的:
- 使用 KDF 來增加熵(如果使用者使用短密碼時尤其好),
- 使用散列來失去資訊,
- 儲存雜湊。
這不應該是儲存密碼的建議方式嗎?
我的理解是KDF 增加了 entropy,而雜湊則失去了資訊。
沒有確定性過程可以增加熵。如果相同的輸入總是產生相同的輸出,那麼與輸出相關的熵不能大於輸入的熵。
混淆可能來自使用密碼拉伸來補償低熵密碼的做法。
這個想法是,使用需要 1 秒計算的算法來破解具有 40 位強度的密碼所花費的時間與使用僅需要 1 微秒的算法來破解具有 60 位強度的密碼所花費的時間大致相同。
$$ 2^{40} \text{ guesses} \times \frac{1 \text{ second}}{\text{guess}} \approx 1.10 \times 10^{12} \text{ seconds}\ 2^{60} \text{ guesses} \times \frac{10^{-6} \text{ seconds}}{\text{guess}} \approx 1.15 \times 10^{12} \text{ seconds}\ $$
我的理解是 KDF 會增加熵,而雜湊會失去資訊。
對於任何內射函式,熵輸出等於熵輸入。對於非內射函式,您最終會將多個輸入映射到相同的輸出。
一些輸出變得更有可能,而其他輸出變得不可能。新的機率分佈將比與輸入相關的分佈具有更少的熵。
散列函式和 KDF 通常都是非內射的。然而,假設一些事情,熵損失不是密碼的問題。(如下所示的非正式解釋。)
理想情況下,使用具有 256 位輸出的雜湊函式意味著您在嘗試之前不會看到任何衝突 $ 2^{128} $ 輸入。(這樣一個函式的生日界限。)如果你測試的多,少得多 $ 2^{128} $ 輸入(密碼),那麼您將極不可能看到任何衝突。*
加密雜湊函式並不是真正的單射函式,但如果我們知道對於給定的一組原像(密碼)沒有衝突,那麼我們可以將(子)映射視為單射的。
這足以非正式地得出結論,如果使用安全散列函式處理典型密碼,則不會失去熵。弱密碼是鏈中最薄弱的環節,而不是雜湊算法。
全人類使用的唯一密碼的數量肯定是微不足道的 $ 2^{128} $ . 它是如此之小,以至於唯一輸出的數量(使用一些大的理想散列函式)實際上肯定與唯一輸入的數量相同。
如果您有超過 256 位的熵輸入,那麼您肯定會失去其中的一些。256 位散列的輸出最多只能有 256 位熵。
在 128 位和 256 位之間,您將失去熵,但我認為輸入熵和輸出熵仍然非常接近。
注意:注意不要在這裡混淆。密碼散列需要抗*衝突是一個常見的誤解。散列函式必須是抗原像的,但如果允許使用者擁有多個有效密碼並無害處,則不需要抗碰撞。出於驗證密碼的目的,只要在非對抗性場景中不太可能發生衝突,就可以使用非防衝突雜湊。
預像抗性是必要的。否則,它將允許知道帳戶密碼雜湊的人偽造密碼,使他們能夠以該使用者身份登錄。認證伺服器不可能僅使用散列來區分原始密碼和第二個原圖像,因此兩個密碼是否不同並不重要。
使用 Argon2 & hairsp; !