openssl kdf 是干什么的
OpenSSL 3.x 引入 kdf 命令,用统一接口调用各种密钥派生函数:HKDF、PBKDF2、TLS13-KDF、SSKDF 等。算法名放在命令末尾,参数通过重复的 -kdfopt 键值传入(如 digest、hexkey、hexinfo、pass、salt、iter)。它适合做两件事:与标准测试向量逐字节比对,以及生成中间材料做迁移验证;生产环境的密钥材料仍应从 KMS 或 HSM 获取。
基本信息
| 可用算法 | openssl list -kdf-algorithms 查看当前构建支持的列表 |
|---|---|
| HKDF | openssl kdf -keylen 32 -kdfopt digest:SHA256 -kdfopt hexkey:... -kdfopt hexinfo:... HKDF |
| PBKDF2 | openssl kdf -keylen 32 -kdfopt pass:... -kdfopt salt:hex:... -kdfopt iter:600000 PBKDF2 |
| 参数形式 | -kdfopt 键值按算法选择,十六进制常用 hex 前缀 |
| 输出 | -binary 输出原始字节,默认十六进制文本 |
| 版本要求 | 3.x 才有该命令,1.1.1 需改用 dgst 与 pkeyutl 组合 |
典型使用场景
- 向量比对:用 RFC 5869 的 HKDF 测试向量验证派生结果逐字节一致。
- 迁移验证:换语言或换库后,用相同参数派生同一密钥并比对。
- 口令强化评估:调整 PBKDF2 迭代次数,实测耗时后再定生产参数。
- 域分离落地:把上下文信息作为 info 参数传入,验证不同用途派生出不同密钥。
- 参数敏感性排查:对比改变 salt、info 或密钥长度后输出是否如期变化。
HKDF 与 PBKDF2 示例
HKDF 与 PBKDF2 示例
# HKDF:只取十六进制前若干字节做快捷验证
openssl kdf -keylen 32 -kdfopt digest:SHA256 -kdfopt hexkey:0b0b0b0b -kdfopt hexinfo:f0f1f2f3 HKDF
# PBKDF2:迭代次数要与生产策略一致才有意义
openssl kdf -keylen 32 -kdfopt pass:password -kdfopt salt:hex:0001020304050607 -kdfopt iter:600000 PBKDF2
# 查看本机支持的派生算法
openssl list -kdf-algorithms | head -20常用参数读法
| 参数键 | 适用算法 | 含义 |
|---|---|---|
| digest | HKDF、SSKDF | 底层哈希算法,默认值未必是你要的 |
| hexkey | HKDF | 输入密钥材料,十六进制书写 |
| hexinfo | HKDF | 上下文与用途信息,做域分离 |
| pass / salt | PBKDF2 | 口令与盐,salt 可用 hex: 前缀 |
| iter | PBKDF2 | 迭代次数,直接决定派生耗时 |
| keylen | 通用 | 输出长度,单位字节 |
参数键名写错时命令不一定报错,可能按默认值继续计算,得出一个看着正常但错误的结果。任何派生结果都要用官方测试向量核对,不要只凭命令成功就采信。
HKDF 的输出长度不是无限的:底层哈希为 SHA-256 时单次最多约 255×32 字节,超过会报错,需要改用更长输出的哈希或重新设计派生结构。
把 info 参数留空是常见疏漏:用同一个根密钥派生加密与认证密钥时,缺少上下文区分会让两条密钥相同,域分离实际没有落地。