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 扩展,否则暴力破解成本不会变高。
标签里建议包含版本与实体信息:把协议版本与设备标识写进上下文,能让升级与多设备场景下的密钥天然隔离。