Key-Derivation

如何在為加密然後 MAC 生成 AES 密鑰和 HMAC 密鑰時對 PBKDF2 進行加鹽?

  • March 7, 2016

當通過密碼使用帶有 AES 和 HMAC 的 Encrypt-then-MAC 時,並給定 128 位的有效載荷和密文來儲存隨機鹽,這將更安全:

  • 使用 PBKDF2 和整個 128 位隨機鹽並生成 512 位派生數據以拆分為 256 位 AES 密鑰和 256 位 HMAC 密鑰。

或者

  • 對每個密鑰分別使用 PBKDF2,使用兩個 64 位鹽生成一個 256 位 AES 密鑰和一個 256 位 HMAC 密鑰。

或者

  • 更好的選擇?

我會使用HKDF的“擴展”步驟從一個主密鑰生成多個密鑰。

使用 PBKDF2 從密碼和 salt 派生該主密鑰。即用PBKDF2替換HKDF的“提取”步驟。

//Extract
MasterKey = PBKDF2(salt, password, iterations)

//Expand
AES-Key = HMAC(MasterKey, "AES-Key" | 0x01)
MAC-Key = HMAC(MasterKey, "MAC-Key" | 0x01)

(其中|表示串聯)

讓 PBKDF2 輸出超過其原始大小是一個壞主意 IMO。它大大增加了防御者的成本(具有數千次迭代的多個密鑰派生),但不會增加攻擊者的成本(他可以在派生一個密鑰後驗證他的密碼猜測的正確性,他不需要兩者)。


如果您使用 512 位散列,例如 PBKDF2 中的 SHA-512 (PBKDF2-HMAC-SHA-512),您也可以簡單地將這 512 位分成兩部分,一個用於加密,另一個用於 MAC。但 IMO 的 HKDF 方法更清潔。

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