從密碼中派生 HMAC 密鑰和密碼密鑰?
我在 CBC 模式下使用 AES-256 加密文件。我需要添加一個 HMAC 來對文件內容和密碼進行身份驗證和驗證,因此我在我的文件塊上累積使用了 SHA-256 HMAC。
我的主要問題是如何從輸入密碼中獲取 HMAC 密鑰和我的 AES 密鑰。我目前正在使用輸入密碼的 SHA-512 散列,將其傳遞給 bcrypt/PBKDF2,並使用鹽和高輪,然後使用 SHA-256 散列來提供我的 AES 密碼密碼。除了我的密碼密鑰之外,為了派生一個 HMAC 密鑰,我正在考慮做以下事情之一:
- SHA-512 強雜湊方法的輸出並將結果分成兩半,使用前半部分作為密碼密碼,後半部分作為 HMAC 密碼。
- 在我的標頭中儲存一個額外的鹽,並在強雜湊後使用 SHA-256 生成密碼後,再次使用 HMAC 密碼的鹽通過 SHA-256 執行結果。
- 與#2 相同,但不含鹽。
除了從相同的輸入密碼片語生成我的密碼密碼之外,這些方法中的哪一種是生成 HMAC 密碼的最佳方法?
如果您使用 AES 和 HMAC 組合進行身份驗證加密,則方案的安全性取決於加密密鑰和消息身份驗證密鑰的獨立性。一般的想法是,您可以通過正確使用一個主密鑰從一個主密鑰生成兩個獨立的密鑰 $ PRF $ . 因此,性能最有效的解決方案是通過以下兩種方式之一修改您的第一個建議:
讓 $ K $ 是 PBKDF2 的輸出。
- Alt 1. 導出加密密鑰 $ K_e $ 和認證密鑰 $ K_a $ 使用一個呼叫每個 $ K_n = PRF_K(label_n) $ . 輸入 $ label_n $ 可能例如分別是單個字元“e”和“a”。
- Alt 2. 推導 $ K’ = K_e||K_a $ 使用一次呼叫 $ PRF_K $ 生成 512 位派生密鑰。
請注意 SHA-512 不是一個偽隨機函式,但可以用來創建一個。例如,您可以使用 HMAC-SHA-512 作為您的 PRF。
這在很大程度上取決於您的系統是關閉還是打開,您將擁有多少使用者,什麼樣的,軟體將如何以及在何處執行等。
作為一般規則,您應該只在密文中儲存真正的隨機數據(而不是雜湊)。您的解決方案 #2 最接近該目標。
請記住,由於 SHA 是為速度而設計的,它可能是一把雙面劍,讓對手更容易暴力破解(或者更糟,如果他們有能力的話)。
在這方面,如果安全性確實是一個問題,您應該建構自己的基於變數的散列方法(非常有創意 - 最不傳統的最好的方法),以確保散列方法隨著輸入數據而變化。
然後,測試它是否有衝突,以確保您沒有違背使用散列的目的。