域分离是什么
域分离指从同一份主密钥派生多把子密钥时,为每个用途绑定不同的上下文信息,让各路派生结果互不相关。做法是把用途标签写进派生参数里——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 加密密钥、会话密钥最好都从同一根上按不同标签派生,既方便轮换根,又避免密钥在代码里到处硬编码。