Skip to content

算法Algorithm

HKDF的提取与扩展

HKDF · HKDF extract-and-expand

分开输入材料净化与带上下文扩展,明确salt、info和长度的职责,以RFC5869向量复算PRK与两块OKM。

形式陈述 ​

HKDF把密钥派生拆成两步。输入材料 IKM 可以是协议产生的共享秘密;salt 是提取阶段的盐,通常可公开;info 是扩展阶段的用途和协议上下文。采用HMAC及输出长度 HashLen:

PRK=HKDF−Extract(salt,IKM)=HMACsalt(IKM).

未提供salt时,RFC5869规定使用 HashLen 个零字节。提取输出PRK应在适用的源分布和HMAC提取假设下可作为伪随机密钥,而不是只因为“已经哈希”便获得保证。扩展接受这样的PRK,令 T0=ϵ,

Ti=HMACPRK(Ti−1‖info‖byte(i)),i=1,…,⌈L/HashLen⌉.

输出 OKM 是 T1‖T2‖⋯ 的前 L 字节;要求 0≤L≤255HashLen。计数器只有一字节,不能默默溢出。SHA-256实例允许至多8160字节输出。

直觉

Extract解决“手上有一种共享秘密,但其字节分布未必适合直接作为PRF密钥”;Expand解决“从一个好密钥,按不同用途得到足够长度的密钥材料”。二者的输入资源不同。

有种子提取器给出统计距离、源熵和独立种子的形式定义;HKDF并不自动继承那个对所有弱源成立的信息论定理。其现实哈希实例和证明使用特定计算假设。最小熵帮助说明已有不确定性,不能被输出长度取代。只可能有1000种的密码即使均匀也至多有 log2⁡1000≈9.97 bit最小熵,最多1000次枚举就可穷尽;提取32字节不能凭空造出256 bit秘密。

例子与边界

RFC5869附录A.1固定SHA-256、22字节 0b 的IKM,salt为 000102030405060708090a0b0c,info为 f0f1f2f3f4f5f6f7f8f9,L=42。提取结果是

077709362c2e32df0ddc3f0dc47bba6390b6c73bb50f9c3122ec844ad7c2b3e5。

扩展需要两块。T1 对 info || 01 计算HMAC;T2 对 T1 || info || 02 计算HMAC。拼接后取32+10字节,得到

3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865。

这可用检查器逐字节核对。若仅改变 L 而info不变,短输出就是长输出的前缀;不同长度不会自行产生独立域。本单元把输出长度也写进info,避免把16字节加密密钥误作32字节MAC密钥的前缀。

salt不需要保密,但其选择与IKM之间的独立性、攻击者能否操纵它以及认证时机属于分析条件。info按RFC5869 §3.2应独立于IKM的值,用来绑定协议、身份和用途;不要把IKM自己塞入info冒充额外熵。由DH值派生时不能仅因它长度够就跳过Extract。

推论与应用

当PRK满足所需的PRF密钥条件,Expand的不同输入可在相应计算模型下近似独立地供给不同用途。完整结论还要计入提取误差、PRF优势和调用数;本页的标准向量只是算法正确性证据。

HKDF适合协议密钥调度,设计目标没有故意增加每次猜测的时间与内存开销。口令存储应由专用慢哈希承担,不能把公开salt加HKDF当作等价替代。一个派生密钥的公开也不自动意味着PRK泄漏,但若PRK泄漏,所有可重建info对应的后续密钥都能重算。

Expand准确调用 N=⌈L/HashLen⌉ 次HMAC,每次输入包含info、最多HashLen字节前块和一字节计数器。若info有a字节,工作量按HMAC块计约为 O(N(1+⌈a/B⌉));生成L字节输出另需线性写出。流式扩展只保存前块和哈希状态,额外空间 O(a+B+HashLen),若返回整段OKM则还需 O(L) 输出空间。

参考资料
  • H. Krawczyk、P. Eronen,RFC 5869,§§2.2–2.3、§§3.1–3.4、§4、附录A.1:接口、独立性、口令边界及向量
  • Dan Boneh、Victor Shoup,作者教材v0.6,§§8.10.1、8.10.5:密钥派生问题与HKDF实例,不把工程算法等同统计提取定理
关系图谱8 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系