首页/安全/加密与证书速查/密钥派生与域分离

密钥派生与域分离

从主密钥派生多把子密钥时,为每个用途绑定不同的上下文(info/label/salt),保证某一路派生结果泄露不影响其它用途;HKDF 是常用实现,OpenSSL 3.x 提供 kdf 子命令。

加密与证书速查安全更新于 2026-10-13

域分离是什么

域分离指从同一份主密钥派生多把子密钥时,为每个用途绑定不同的上下文信息,让各路派生结果互不相关。做法是把用途标签写进派生参数里——HKDF 的 info、SP 800-108 的 label/context、协议里的固定字符串都属此类。缺了这一步,加密密钥与认证密钥可能完全相同:一处侧信道或实现缺陷泄露其中一把,另一用途跟着失守。域分离的落地要点是标签必须唯一且稳定,改标签等于换密钥。

基本信息

核心要求同一主密钥派生多用途密钥必须使用不同的 info/label/salt
常见错误不同用途派生出相同密钥材料,一处泄露全线失守
相关规范HKDF(RFC 5869)、NIST SP 800-108(基于 KDF 的派生)
工具支持OpenSSL 3.x 的 kdf 子命令可指定 hexinfo 等参数
标签设计唯一、可读、写入版本号,且不得随意变更
适用范围协议密钥、Token 签名、Cookie 加密、文件加密都用得上

典型使用场景

  • 协议实现:从主密钥派生加密密钥、完整性密钥与 IV 材料。
  • 应用层加密:Token 签名密钥与 Cookie 加密密钥同源派生但用途分离。
  • 多租户隔离:按租户标识派生独立密钥,避免跨租户影响。
  • 版本迁移:把版本号写进标签,新旧密钥可并存过渡。
  • 测试向量核对:验证不同 info 是否确实得到不同输出。

HKDF 派生示例(OpenSSL 3.x)

HKDF 派生示例(OpenSSL 3.x)
openssl kdf -keylen 32 -kdfopt digest:SHA256 \
  -kdfopt hexkey:00112233445566778899aabbccddeeff \
  -kdfopt info:enc-v1 HKDF
# 换一个 info 即得到完全不同的密钥材料
openssl kdf -keylen 32 -kdfopt digest:SHA256 \
  -kdfopt hexkey:00112233445566778899aabbccddeeff \
  -kdfopt info:auth-v1 HKDF
# 核对:两次输出必须不同;相同说明参数没有真正生效

派生参数与作用

参数作用注意
key(IKM)输入密钥材料来自主密钥或密钥管理系统
salt提升派生强度并区分场景留空会降低强度并减弱区分度
info / label绑定用途的主要手段必须唯一且稳定,写明用途与版本
keylen输出长度按算法要求取足,勿截断使用
digest底层哈希写进设计文档,避免实现间不一致
域分离的原则同样适用于应用层凭据派生:Token 签名密钥、Cookie 加密密钥、会话密钥最好都从同一根上按不同标签派生,既方便轮换根,又避免密钥在代码里到处硬编码。

易错点

  • 多个用途共用同一派生上下文:一处密钥泄露直接牵连其他用途。
  • 派生参数写错但不报错:产出与预期不同的密钥材料,问题往往在互通或数据无法解密时才暴露。
  • 擅自修改已有标签:等于更换密钥,历史数据与已签发凭据全部失效。
  • 把 info 写成固定占位值:看似做了域分离,实际所有用途派生出同一把密钥。

数据来源与参考

  • RFC 5869(HKDF)
  • NIST SP 800-108(基于 KDF 的派生)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌