密鑰派生函式與密碼散列方案
密鑰派生函式,例如 HKDF(在RFC 5869中標準化),旨在將一些具有足夠熵的初始密鑰材料(例如 Diffie-Hellman 共享值)擴展為一個或多個強加密密鑰。
密碼散列方案(例如PHC獲勝者Argon2)旨在對通常低熵的密碼進行散列,目的是使散列摘要反轉在 CPU 和記憶體消耗以及並行化方面對攻擊者而言盡可能昂貴。
是否準確地認為密碼雜湊方案實際上是專門用於低熵輸入的密鑰派生函式?或者這兩種類型的密碼方案之間在理論上是否存在任何其他本質區別?
密鑰派生函式會做一些事情:
- 將具有高min-entropy 初始密鑰材料的隨機比特串變成有效均勻*的隨機比特串。
- 按目的標記生成的統一位串的各個部分,以便可重複推導。
- 防止多目標攻擊節省一個因素 $ n $ 攻擊其中之一的成本 $ n $ 帶有可選鹽的目標。
通常,部分 (1) 和 (3) 以提取/擴展形式與部分 (2) 分開完成,例如, $ \operatorname{HKDF-Extract}(\mathit{salt}, \mathit{ikm}) $ 這變成了一個高最小熵的初始密鑰材料 $ \mathit{ikm} $ 成一個有效統一的隨機主密鑰 $ \mathit{prk} $ 用可選的鹽,和 $ \operatorname{HKDF-Expand}(\mathit{prk}, \mathit{info}, \mathit{noctets}) $ 它從一個統一的隨機主密鑰中派生出有效的獨立子密鑰 $ \mathit{prk} $ 由 $ \mathit{info} $ 範圍。如果您已經有一個統一的隨機主密鑰來啟動,您可以跳過 HKDF-Extract 並將其直接傳遞給 HKDF-Expand。
密碼雜湊還有一個額外的用途:
- 評估成本很高——在時間、記憶體和並行性方面。
這樣,即使我們無法控制找到密碼的預期猜測次數,我們也可以控制測試每次猜測的成本,從而推高找到密碼的預期成本。
具體來說,密碼雜湊通常執行第 (1)、(3) 和 (4) 部分,將 (2) 中子密鑰的可重複標記推導留給 HKDF-Expand 之類的函式。例如,使用 PBKDF2 生成多個輸出塊實際上可能會造成傷害,因此您絕對應該使用 HKDF-Expand 將單個主密鑰從 PBKDF2 轉換為多個子密鑰。也就是說,這種特殊的病理在 Argon2 中是固定的,但 HKDF-Expand 可能仍然更方便按目的標記子鍵。
概括:
- 如果您有像 Diffie–Hellman 共享密鑰這樣的高最小熵但不均勻的密鑰,請使用 HKDF-Extract。
- 如果您有像密碼這樣的低最小熵秘密,請使用 Argon2。
然後通過 HKDF-Expand 傳遞您從中獲得的有效統一的主密鑰,以派生用於標記目的的子密鑰。
做出選擇的過程的最小熵*是衡量任何結果的最高機率的指標;具體來說,如果在某個程序選擇的(比如說)密碼的有限空間中, $ i^{\mathit{th}} $ 密碼是 $ p_i $ , 過程的最小熵是 $ -\max_i \log_2 p_i $ 位。如果有程序是從 $ n $ 選項,這個過程的最小熵很簡單 $ \log_2 n $ . 例如,十個單詞的 diceware 程序有 $ \log_2 7776^{10} \approx 129.2 $ 位最小熵。