您應該/不應該在 HKDF 中使用鹽的應用程序
rfc5869 對 HKDF 鹽的使用或缺乏有以下說法:
HKDF 被定義為在使用和不使用隨機鹽的情況下執行。這樣做是為了適應鹽值不可用的應用程序。然而,我們強調,鹽的使用顯著增加了 HKDF 的強度,確保雜湊函式的不同用途之間的獨立性,支持“與源無關”的提取,並加強支持 HKDF 設計的分析結果。
以上所有內容在密碼散列的上下文中都是有意義的,但據我所知,這不是對 HKDF 函式的適當使用。似乎建議使用鹽來確保函式的兩個實例在與相同的輸入密鑰材料一起使用時不會返回相同的輸出密鑰材料;唯一可能發生這種情況的情況(我目前知道)是當 IKM 是使用者生成的密碼時。所以我的問題是:
- 雜湊函式的兩次使用是獨立的,這意味著什麼?
- “源獨立提取”是什麼意思?
- 什麼是絕對應該與 HKDF 一起使用鹽的案例的實際範例?
使用鹽有兩個目的:域分離和隨機性提取。
如果您確定您的 IKM(輸入密鑰材料)僅在一個“域”中使用,則不需要用於域分離的鹽。在同一個域中,您可以使用 info 參數從同一個 IKM 為域內的不同上下文生成多個密鑰。
如果您的 IKM 已經是均勻隨機的(例如,當它是用於通過 HKDF 派生子密鑰的均勻隨機私鑰時),那麼如果 IKM 具有足夠的位長,則您不需要鹽來提取隨機性為您的目的。
域分離
“ Cryptographic Extraction and Key Derivation: The HKDF Scheme ”論文第26頁(簡稱
$$ HKDF-paper $$在 rfc5869 中)給出了域分離必要性的以下範例:
這種獨立性的重要性可以通過以下“現實生活”範例來說明…… Diffie-Hellman 交換通過簽署密鑰進行身份驗證 $ g^{xy} $ . 實際上,簽署的是 $ H(g^{xy}) $ 對於一些雜湊函式 $ H $ ,比如說 SHA-1。如果簽名允許消息恢復(例如 RSA),那麼攻擊者不會學習 $ g^{xy} $ 反而 $ H(g^{xy}) $ ; 因此,如果一個人想到 $ H $ 作為一個隨機的預言機,那麼什麼都學不到 $ g^{xy} $ . 現在,假設上述協議通過傳統的 KDF 派生密鑰,即密鑰計算為 $ H(g^{xy} \mathbin| v) $ 對於一些公共價值觀 $ v $ . 在這種情況下,如果我們遵循 $ H $ = SHA-1 範例並假設 $ g^{xy} $ 長度為 1024,我們得到那個計算 $ H(g^{xy}\mathbin|v) $ 和計算一樣 $ H $ 上 $ v $ 與 IV $ H $ 調成 $ H(g^{xy}) $ (為簡單起見,假設計算 $ H $ 上 $ g^{xy} $ 不使用長度附加)。然而,這意味著攻擊者學習了所有的密鑰,因為他知道 $ H(g^{xy}) $ !協議的失敗不是由於特定的弱點 $ H $ 而是將相同的(確定性)函式用於兩個不同的功能:雜湊函式應用於 $ g^{xy} $ 和 KDF。相反,如果一個鍵 $ H $ 通過 KDF 使用的鹽值,可以強制這兩個功能之間的獨立性。
HDKF 包括兩個階段:
- HKDF-Extract: PRK = HMAC-Hash(salt, IKM)
- HKDF-Expand(PRK, info, L) -> OKM
(其中 IKM 是“輸入密鑰材料”,PRK 是“偽隨機密鑰”,OKM 是“輸出密鑰材料”,L 是所需輸出的長度)。
因此,如果沒有使用鹽,並且 HMAC-Hash(NULL, IKM) 的值以某種方式洩露(例如在上面的“消息恢復”場景中),那麼以後使用相同的 IKM 並且沒有鹽的 HKDF 的所有使用都會也會受到損害。
如果您不需要鹽來進行域分離,那麼您應該考慮是否需要鹽來進行隨機性提取。這個問題張貼在這裡。