Hash

PBKDF2 比本機輸出長度長 - 散列結果有幫助嗎?

  • January 23, 2018

我已經看到它不止一次提到 PBKDF2 不應用於創建比本機輸出更長的密鑰(例如與 HMACSHA1 一起使用時為 160 位)。由於攻擊者只能測試本機大小並排除密碼。(

但是,如果我們再對(完整的)結果進行一次散列呢?這似乎可以解決問題。因為沒有整個計算 - 任何部分都不會被知道。

我對麼?

重申和擴展連結範例所說的內容:當使用 PBKDF2-HMAC-H 儲存密碼雜湊(加鹽/加胡椒)以供以後比較時,製作 PBKDF2 的輸出大小參數是沒有意義的 $ \mathsf{dkLen} $ 超過輸出大小 $ h $ H 的八位字節(如果 $ h\ge16 $ 八位字節或類似的門檻值),不超過也許 $ 20 $ 八位字節,因為:

  • 進行暴力密碼搜尋的對手很少會找到第一個匹配項 $ h $ 八位字節:當找到正確的密碼時,或有機率 $ 2^{-8h} $ 對於隨機的其他輸入。因此,搜尋可以跳過對絕大多數測試密碼的其他八位字節的(獨立)計算。過去的額外數據 $ h $ 對合法使用者有成本,但對攻擊者幾乎沒有成本(佔總工作量的比例)。因此合法使用者更好地降低 $ \mathsf{dkLen} $ 至 $ h $ (只要它仍然足以排斥與錯誤密碼的意外匹配,這 $ \mathsf{dkLen}\ge16 $ 在實踐中確保足夠好),並且應該增加 PBKDF2 迭代次數,這將使攻擊者付出代價。
  • 在實踐中,找到與雜湊匹配的真實密碼以外的密碼的機率超過大約 $ 20 $ 八位字節不可能低,從這個角度來看,添加更多八位字節不會增加有用的安全性。

所以沒有真正要解決的問題;當使用 PBKDF2-HMAC-H 儲存密碼散列時(因此使用通用加密散列 $ h\ge16 $ ),我們可以使用 $ \min(h,20) $ 為了 $ \mathsf{dkLen} $ , 並將 PBKDF2 的迭代計數泵到我們可以負擔得起的任何合理使用的可比性能。如果 $ \mathsf{dkLen} $ 曾是 $ l $ 八位字節 $ l>h $ ,我們可以將迭代次數(因此攻擊時間)乘以一個因子 $ \lceil l/h\rceil $ 以合法使用者的可比成本。

但是,是的,在應用程序中保留密碼雜湊以供以後比較是正確的,使用 H(或另一個雜湊)重新雜湊 PBKDF2-HMAC-H 的結果 $ h\ge16 $ 八位字節,並截斷為 $ 20 $ 八位字節,同樣會縮短結果,並且與儲存整個結果相比不會造成傷害。事實上,計算整個 PBKDF2 輸出對於找到整體雜湊是必要的,這迫使攻擊者對每個密碼執行合法使用者所做的所有工作。因此,安全性相當於減少 $ \mathsf{dkLen} $ .

在要求更長的輸出並對其進行散列以獲得最終結果時,我能想到的唯一好處是,增加的複雜性將需要更複雜的程式碼來破解暴力密碼。但這甚至不需要與記憶體成正比的記憶體 $ \mathsf{dkLen} $ (最終的雜湊值可以即時計算),因此它不會顯著增加密碼破解器的建構和運營成本,該密碼破解器設計得很好。

注:大 $ \mathsf{dkLen} $ 除了測試密碼是否正確之外,在 PBKDF2 的應用程序中仍然有意義。

注意:與引用的評論相反,在數學上不確定如果第一個 $ h $ 八位字節匹配,其他字節匹配;那很有可能。

是的,您可以在結果上使用更大的輸出雜湊函式。這不會使對手受益,也不會增加您的工作因素(或迭代次數)。

但是,由於您似乎想要派生密鑰材料,因此最好使用基於密鑰的 KDF,例如 HKDF。這將為您提供SEJPM在評論中提出的算法和參數。

HKDF-expand 被定義為從給定的輸入密鑰材料中派生更大的輸出密鑰材料。

無論 KBKDF 的輸出密鑰大小如何,安全性都將受到 PBKDF2 中使用的散列的約束。但這不是問題。KDF 通常會生成加密強的輸出。

引用自:https://crypto.stackexchange.com/questions/54922