首页/安全/加密与证书速查/密钥派生函数(KDF)
加密算法基础95 条

密钥派生函数(KDF)

从口令、共享秘密或主密钥派生用途分离的子密钥:口令类用 PBKDF2/scrypt/Argon2,通用类用 HKDF 或 NIST SP 800-108 系 KDF。

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

KDF 解决什么问题

密钥派生函数把主密钥、共享秘密或口令扩展成多把用途分离的子密钥,解决的是密钥复用问题:加密、完整性校验、初始化向量如果共用同一把密钥,任何一处泄露都会牵连全部。按输入类型分两类:口令类(PBKDF2、scrypt、Argon2)强调计算与内存代价,通用类(HKDF、NIST SP 800-108 系)假设输入已有足够熵,只负责扩展与分离。

基本信息

目标避免密钥复用、实现用途分离、支持轮换
输入要素主密钥或共享秘密,加上盐与上下文标签
输出固定长度子密钥,按用途分别派生
标准RFC 5869(HKDF)、NIST SP 800-108
口令类PBKDF2、scrypt、Argon2
通用类HKDF、基于分组密码的 KDF

典型使用场景

  • 会话安全:从协商出的共享秘密派生方向不同的加密与认证密钥
  • 口令派生密钥:先用慢散列提纯,再扩展为实际使用的密钥
  • 存储加密:从主密钥派生每个对象独立的数据密钥
  • 协议设计:用上下文标签把同一主密钥隔离到不同用途
  • 轮换:更换主密钥即可重新派生全部子密钥

OpenSSL 3 的 kdf 命令

OpenSSL 3 的 kdf 命令
# 用 HKDF 从主密钥派生 32 字节子密钥,info 绑定用途
openssl kdf -keylen 32 -kdfopt digest:SHA256 -kdfopt hexkey:00112233445566778899aabbccddeeff -kdfopt hexsalt:0102030405060708 -kdfopt info:enc-key HKDF
# 同一主密钥派生另一用途的密钥:只改 info,输出完全不同
openssl kdf -keylen 32 -kdfopt digest:SHA256 -kdfopt hexkey:00112233445566778899aabbccddeeff -kdfopt info:mac-key HKDF
# 列出本机支持的 KDF 算法
openssl list -kdf-algorithms

两类 KDF 对照

类别代表算法输入假设典型用途
口令类PBKDF2、scrypt、Argon2低熵口令口令存储、由口令派生密钥
通用类HKDF已有足够熵协议密钥调度、子密钥分离
基于分组密码NIST SP 800-108 系主密钥密码机与金融规范
自造拼接不推荐无不应使用
派生时带用途标签(如 enc、mac、iv),不同用途的密钥在数学上相互独立,某一处泄漏不会直接波及全部。
KDF 不提升熵:低熵口令必须先经过慢散列提纯,再交给 HKDF 这类通用 KDF 扩展,否则暴力破解成本不会变高。
标签里建议包含版本与实体信息:把协议版本与设备标识写进上下文,能让升级与多设备场景下的密钥天然隔离。

易错点

  • 用同一主密钥直接充当多种用途的密钥(加密也用、MAC 也用)会打破密钥分离
  • KDF 不提升熵:低熵口令需先经过慢散列,再交给 HKDF
  • 自造派生方式(如简单哈希拼接)缺少分析,容易引入无关密钥
  • 上下文标签不带版本号,协议升级后新旧版本派生出相同密钥
  • 派生参数与盐不随子密钥一起记录,日后无法复现派生结果

数据来源与参考

  • RFC 5869(HKDF)
  • NIST SP 800-108 Rev.1(基于 PRF 的 KDF)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌