Authentication
散列用於身份驗證的雜湊
我目前使用Argon2從我將用於加密文件的給定密碼(算法:AES CBC PKCS7Padding)。
當使用者輸入密碼時,我需要驗證它是正確的密碼,儲存密鑰或密碼當然會破壞加密(因為如果它是他們可以解密的密鑰,如果是密碼他們可以再次派生密鑰)
所以從我所看到的我有兩個選擇
- 使用 Argon2 作為散列函式而不是 KDF 函式並儲存結果(我將在兩次 Argon2 呼叫之間更改鹽),您可能會猜到這會很慢。
- 使用SHA-256散列密鑰
為了驗證,我將使用選項 1 或選項 2 重新散列並檢查它是否匹配。
問題
- 選項 2 會獲得與選項 1 相同的安全性嗎?
- 如果我對鹽使用選項 2,我應該使用專門為此生成的新鹽(我將作為明文儲存在文件中以供以後驗證)還是使用與初始 Argon2 KDF 一起使用的鹽或不使用鹽?
執行 Argon2(或任何其他密鑰擴展 KDF)兩次以從同一個密碼生成兩個不同的密鑰(或其他輸出)不是一個好主意,因為它使密鑰派生速度慢了一倍,同時又不會使密碼更難破解蠻力。或者,換句話說,它使密碼破解速度比僅執行 KDF 一次和兩倍的迭代快兩倍。
使用安全的加密散列(例如 SHA-256)對密鑰進行散列,並將散列與加密數據一起儲存是實現密鑰檢查值的一種非常好的和安全的方法。你甚至不需要儲存整個雜湊;比如說,散列的前 32 位或 64 位應該足以擷取任何意外輸入錯誤的密碼。
或者,您可以使用 Argon2 輸出作為快速非基於密碼的 KDF(例如HKDF-Expand )的輸入,並使用它來派生加密密鑰和單獨的檢查值。這是一個通用的解決方案,只要您想從同一個密碼派生多個準獨立密鑰(或檢查值等),它就可以工作。特別是,這種方法比您建議的散列密鑰提供了更強的獨立性保證:不僅不能從檢查值計算密鑰,而且(假設底層散列函式沒有被嚴重破壞)檢查值也無法從密鑰計算。