跳转到内容

草稿: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=被忽略 (帮助)