跳至內容

草稿:HKDF

維基百科,自由的百科全書

HKDF 是一種基於HMAC訊息認證碼(message authentication code)的多用途金鑰衍生函式(KDF)。HKDF 採用「先提取後擴展」(extract-then-expand)架構[1],其邏輯上由兩個部分組成:第一階段從輸入的金鑰材料中「提取」出固定長度的偽隨機金鑰;第二階段則將該金鑰「擴展」為多個彼此獨立的偽隨機金鑰,作為 KDF 的輸出。

運作原理

[編輯]

HKDF 由兩個函數組成:HKDF-Extract(提取)和 HKDF-Expand(擴展)[2]:

HKDF⁡(𝑠𝑎𝑙𝑡,𝐼𝐾𝑀,𝑖𝑛𝑓𝑜,L)=HKDF−Expand⁡(HKDF−Extract⁡(𝑠𝑎𝑙𝑡,𝐼𝐾𝑀),𝑖𝑛𝑓𝑜,L)

HKDF-Extract

[編輯]

說明

[編輯]

HKDF-Extract(XTR)接收「輸入金鑰材料」或「來源金鑰材料」(IKM 或 SKM,例如使用迪菲-赫爾曼金鑰交換產生的共享秘密),以及可選的、非秘密的隨機或偽隨機鹽值(r),並產生稱為 PRK(「偽隨機金鑰」,pseudorandom key)的密碼學金鑰。HKDF-Extract 的作用相當於一個「隨機性提取器」:它接收一個具有足夠最小熵的輸入值,即使該值的分佈可能不均勻。經過處理後,它會產生一個偽隨機值。從計算上而言,該偽隨機值與均勻隨機值不可區分。[3]隨機性提取器假設攻擊者的計算能力受到限制,且來源的熵可能僅在計算意義下存在。[4]這類提取器可以在適當的假設下利用密碼學函數建構;在一般情況下可使用通用雜湊函數(universal hash function)[5],而在受限場景(如弱熵源)下則可使用隨機預言機(random oracle)進行建模。[6]

鹽值(r)可作為「與來源無關的提取器」(source-independent extractor),增強 HKDF 的安全性。隨機鹽值可以使輸入金鑰材料(IKM)的來源與提取器彼此獨立。只要鹽值不是由攻擊者選擇或操縱,即使在多次使用 HKDF 時使用固定的公開鹽值也是安全的。理想情況下,鹽值應為隨機字串,且長度等於雜湊函數的輸出長度;即使鹽值的熵較低或長度較短,仍能對輸出金鑰材料(OKM)的安全性提供額外保障。若沒有鹽值,或鹽值的熵很低,而攻擊者又能影響 IKM 的來源,則 HKDF-Extract 可能無法抵禦底層雜湊函數所遭受的特定攻擊。因此,在可能的情況下使用隨機鹽值可以增強 HKDF 的安全性。[7]

HKDF-Extract 是以 r 為金鑰、以 IKM 為訊息計算 HMAC 的結果;如果未提供 r,則使用長度等於底層雜湊函數輸出長度的全零字串作為金鑰。[2]HKDF-Extract 所使用的底層雜湊函數可以與 HKDF-Expand 所使用的不同。建議 HKDF-Extract 使用應用程式可用的最強雜湊函數,因為它主要是「集中」IKM 中已有的熵,而不一定會增加熵。攻擊者被假設已掌握部分 IKM 的資訊(例如 Diffie-Hellman 中公開的資訊),或能夠部分控制其內容(例如熵池)。[1]

如果 IKM 本身就是密碼學上足夠強的金鑰,則可以省略 HKDF-Extract,直接將其視為 PRK。不過,為了與一般情況保持一致,仍建議執行 HKDF-Extract,尤其是在應用程式可以提供 r 的情況下。[2]

計算方式

[編輯]

HKDF-Extract 的計算方式為:

PRK=HMAC⁡(r,IKM)

其中,r 為鹽值,IKM 為輸入金鑰材料,而 PRK 為產生的偽隨機金鑰。如果未提供鹽值,則使用長度等於底層雜湊函數輸出長度的全零字串作為 r。[2]

HKDF-Expand

[編輯]

說明

[編輯]

HKDF-Expand(PRF∗)接收 PRK(如果省略 HKDF-Extract,則可直接使用其他密碼學上安全的金鑰)、可選的上下文資訊 info(CTXinfo)以及所需的輸出長度 L,並產生長度為 L 的輸出金鑰材料(OKM)。使用不同的 CTXinfo 可以從同一個 PRK 產生多組彼此獨立的輸出金鑰材料;CTXinfo 應與 HKDF-Extract 使用的 IKM 保持獨立。

HKDF-Expand 可以視為一個以 PRK 為金鑰、具有可變輸出長度的偽隨機函數(PRF∗)。它以 CTXinfo 和從 1 開始的 8 位元計數器 i 作為輸入計算 HMAC;後續計算會將前一次 HMAC 的輸出加入輸入,形成鏈式結構,直到產生足夠長度的 OKM。

每次 HMAC 計算產生的輸出長度取決於底層雜湊函數。例如使用 SHA-256 時,每次產生 256 位元的輸出,因此 OKM 的最大長度為:

255×256 bits=8160 bytes

實際輸出則截取至所要求的長度 L。如果 PRK 本身已經至少與所需的 L 一樣長,則可以省略 HKDF-Expand;不過,仍建議執行 HKDF-Expand,以進一步對輸出金鑰材料進行「平滑化」(smoothing)。[2]

計算方式

[編輯]

HKDF-Expand 使用 PRK 作為 HMAC 的金鑰,並依序計算:

T(0)=∅

T(i)=HMAC⁡(PRK,T(i−1)‖info‖Int8⁡(i))

其中,T(i) 為第 i 次 HMAC 計算的輸出,info 為可選的上下文資訊,Int8⁡(i) 為以 8 位元表示的計數器。計算從 i=1 開始,將各次產生的 T(i) 依序串接,並截取前 L 個位元組作為輸出金鑰材料 OKM。最多可以計算 255 個區塊,因此 L 不得超過 255×HashLen。[2]

HKDF 的完整流程圖

標準化

[編輯]

HKDF 最初被提出作為各種通訊協定與應用程式的密碼學構建模組,同時旨在避免不同應用程式各自採用不同的金鑰導出機制。[2]

HKDF 於 2010 年正式定義於 RFC 5869,其設計與安全性分析則在 Krawczyk 於同年發表的論文。[1]

NIST 的 NIST SP 800-56C 也規範了可參數化的「先提取後擴展」(extract-and-expand)金鑰導出方案,並指出 RFC 5869 中的 HKDF 是該方案的一種實例。[8]

應用

[編輯]

HKDF 被廣泛應用於各種密碼學協定。例如,Signal Protocol 使用 HKDF 產生訊息金鑰,並與三重橢圓曲線迪菲-赫爾曼(X3DH)金鑰協議搭配使用。[9]HKDF 也是 Noise Protocol Framework、Message Layer Security 的重要組成部分[10][11],並應用於 IPsec 的互聯網金鑰交換(IKE)和 TLS 1.3 等協定。[12][13]

HKDF 的「多用途」設計旨在支援需要金鑰提取、金鑰擴展以及金鑰階層的應用,包括金鑰封裝、金鑰交換、偽隨機數生成器(PRNG)和基於密碼的金鑰導出函數(PBKDF)等。

參考文獻

[編輯]
  1. ^ 1.0 1.1 1.2 Krawczyk, Hugo, Rabin, Tal , 編, Cryptographic Extraction and Key Derivation: The HKDF Scheme 6223, Springer Berlin Heidelberg: 631–648, 2010 [2026-08-17], ISBN 978-3-642-14622-0, doi:10.1007/978-3-642-14623-7_34 
  2. ^ 2.0 2.1 2.2 2.3 2.4 2.5 2.6 Hugo Krawczyk; Pasi Eronen. HMAC-based Extract-and-Expand Key Derivation Function (HKDF). Internet Engineering Task Force. 2010-05. 
  3. ^ Dodis, Yevgeniy; Ostrovsky, Rafail; Reyzin, Leonid; Smith, Adam. Fuzzy Extractors: How to Generate Strong Keys from Biometrics and Other Noisy Data. SIAM Journal on Computing. 2008-01, 38 (1) [2026-08-17]. ISSN 0097-5397. doi:10.1137/060651380 (英語). 
  4. ^ Goldreich, O.; Levin, L. A. A hard-core predicate for all one-way functions. ACM Press. 1989 [2026-08-17]. ISBN 978-0-89791-307-2. doi:10.1145/73007.73010 (英語). 
  5. ^ Impagliazzo, R.; Levin, L. A.; Luby, M. Pseudo-random generation from one-way functions. ACM Press. 1989 [2026-08-17]. ISBN 978-0-89791-307-2. doi:10.1145/73007.73009 (英語). 
  6. ^ Bellare, Mihir; Rogaway, Phillip. Random oracles are practical: a paradigm for designing efficient protocols. ACM Press. 1993 [2026-08-17]. ISBN 978-0-89791-629-5. doi:10.1145/168588.168596 (英語). 
  7. ^ Fischlin, Marc; Janson, Christian; Mazaheri, Sogol. Backdoored Hash Functions: Immunizing HMAC and HKDF. IEEE. 2018-07 [2026-08-17]. ISBN 978-1-5386-6680-7. doi:10.1109/CSF.2018.00015. 
  8. ^ Barker, Elaine; Chen, Lily; Davis, Richard. Recommendation for Key-Derivation Methods in Key-Establishment Schemes (PDF) (報告). National Institute of Standards and Technology. 2020-08-18. doi:10.6028/nist.sp.800-56cr2. 
  9. ^ Specifications >> The X3DH Key Agreement Protocol. Signal Messenger. [2026-08-17] (英語). 
  10. ^ Barnes, R.; Beurdouche, B.; Robert, R.; Millican, J.; Omara, E.; Cohn-Gordon, K. The Messaging Layer Security (MLS) Protocol (報告). Internet Engineering Task Force. 2023-07.  |issue=被忽略 (幫助)
  11. ^ Specifications >> The X3DH Key Agreement Protocol. Signal Messenger. [2026-08-17] (英語). 
  12. ^ Rescorla, E. The Transport Layer Security (TLS) Protocol Version 1.3 (報告). Internet Engineering Task Force. 2018-08.  |issue=被忽略 (幫助)
  13. ^ Kaufman, C.; Hoffman, P.; Nir, Y.; Eronen, P.; Kivinen, T. Internet Key Exchange Protocol Version 2 (IKEv2) (報告). Internet Engineering Task Force. 2014-10.  |issue=被忽略 (幫助)