Key-Derivation
如何在為加密然後 MAC 生成 AES 密鑰和 HMAC 密鑰時對 PBKDF2 進行加鹽?
當通過密碼使用帶有 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 方法更清潔。