HKDF 密钥派生
RFC 5869 基于 HMAC 的提取-扩展密钥派生
HKDF 技术文档
HKDF(基于 HMAC 的提取-扩展密钥派生函数)由 RFC 5869 定义。它通过两阶段处理(提取和扩展)从输入密钥材料中派生加密密钥,是一种可靠的密钥派生方法。
HKDF 被广泛应用于现代安全协议,包括 TLS 1.3、Signal 协议、Noise 协议框架和 SSH。其提取和扩展阶段的清晰分离使其特别适合密钥层次结构的派生。
提取阶段:HKDF-Extract(salt, IKM) → PRK
提取阶段将输入密钥材料(IKM)中可能分散的熵集中到固定长度的伪随机密钥(PRK)中:
- 以盐值(可选,默认为 HashLen 个零字节)和 IKM 作为输入
- 计算 PRK = HMAC-Hash(salt, IKM)
- PRK 长度等于哈希输出长度(SHA-256 为 32 字节)
- 盐值作为 HMAC 的密钥,增强提取效果
扩展阶段:HKDF-Expand(PRK, info, L) → OKM
扩展阶段将 PRK 拉伸为所需长度的输出密钥材料(OKM):
- 以 PRK、info(上下文/标签)和期望输出长度 L 作为输入
- 迭代计算 T(i) = HMAC-Hash(PRK, T(i-1) | info | counter)
- 连接结果:OKM = T(1) | T(2) | ... | T(N)
- 最大输出长度为 255 × HashLen 字节
典型应用场景
- TLS 1.3 密钥调度:派生流量密钥、握手密钥和应用密钥
- Signal 协议:从共享密钥派生链密钥和消息密钥
- SSH 密钥交换:ECDH 后派生加密密钥和完整性密钥
- 密钥层次结构:从主密钥派生多个用途特定的子密钥
HKDF 与 PBKDF2 对比
| 特性 | HKDF | PBKDF2 |
|---|---|---|
| 标准 | RFC 5869 | RFC 8018 |
| 输入类型 | 共享密钥、DH 输出 | 用户密码 |
| 迭代次数 | 单次处理 | 大量 (10K-1M) |
| 速度 | 快速 | 故意缓慢 |
| Info 参数 | 支持(上下文绑定) | 不支持 |
| 主要用途 | 高熵输入 | 低熵密码 |
安全注意事项
- HKDF 假设 IKM 已包含足够的熵;请勿用于弱密码
- info 参数应唯一标识密钥的预期用途(上下文分离)
- 盐值是可选的,但建议在从同一 IKM 提取多个密钥时使用
- PRK 不应直接使用;始终使用扩展阶段派生最终密钥