持久内存与安全机制 - 第398页
我们现在来深入解析 NVMe Base Specification 2.0b 中 8.13.5.8 和 8.13.5.9 两节的内容,重点在于:
✅ 8.13.5.8 Secret Representation(密钥表示与验证机制)
这一节讲的是:如何以标准格式表示和管理 DH-HMAC-CHAP 的密钥(secret),便于复制、粘贴、配置。
🔹Secret 格式定义
所有支持 NVMe over Fabrics 的实体(Host / Controller)都必须支持以下 ASCII 表示法:
DHHC-1:xx:<Base64编码的密钥和CRC32校验值>:
各部分含义如下:
| 字段 | 含义 |
|---|---|
DHHC-1 |
表示此为 DH-HMAC-CHAP V1 协议密钥格式 |
: |
分隔符 + 终结符 |
xx |
指定使用的哈希算法(参见 Figure 446) 例如 “01” 表示 SHA-256, “00” 表示不使用 transform,直接使用原始密钥 |
<Base64> |
对如下数据进行 Base64 编码: ① 二进制密钥(32/48/64 字节)+ ② CRC-32 校验值(4 字节) |
最后一个 : |
终结符 |
🧪 示例解析
如果我们有如下 32 字节的密钥:
89AE B31A 874E AF84 841B 4673 6B0D FDF2
BA58 D30A A2A5 45A3 E235 A352 1E07 594C
其 Base64 + CRC-32 编码的字符串是:
ia6zGodOr4SEG0Zzaw398rpY0wqipUWj4jWjUh4HWUz6aQ2n
最终完整表示形式是:
DHHC-1:00:ia6zGodOr4SEG0Zzaw398rpY0wqipUWj4jWjUh4HWUz6aQ2n:
表示此密钥将被 直接使用(00),无需再 HMAC 派生。
✅ 验证机制
- 每个实体接收到密钥时,应计算其 CRC-32 值并与 Base64 字符串末尾的校验值进行比较。
- 如果 校验失败,该密钥必须视为 无效,不可使用。
✅ 8.13.5.9 使用 DH-HMAC-CHAP 生成 TLS PSK(预共享密钥)
当 DH-HMAC-CHAP 使用了 非 NULL DH Group 时,可用于生成一个会话密钥 KS,进而生成用于 TLS 安全通道的 预共享密钥(PSK)。
🔸如何启用 TLS + DH-HMAC-CHAP 协同使用?
在 AUTH_Negotiate 消息中,主机设置:
SC_C = 01h → 表示:需要将 TLS 通道连接至此认证事务
🔹Session Key KS 计算方式
| 实体 | 公式 |
|---|---|
| 主机 | KS = H((gx mod p)^y mod p)→ 主机从控制器收到 gx mod p,与本地 y 计算 |
| 控制器 | KS = H((gy mod p)^x mod p)→ 控制器从主机收到 gy mod p,与本地 x 计算 |
H():由HashID指定的哈希函数(如 SHA-256)KS是 共享会话密钥
🔸如何计算 PSK(Pre-Shared Key)
一旦 KS 生成成功,TLS 所需的 PSK 由下式给出:
Generated_PSK = HMAC(KS, C1 || C2)
C1:控制器发的挑战值C2:主机发的挑战值KS:DH 生成的会话密钥
这个 PSK 可以用于建立 TLS 通道,如用于加密 管理队列或 I/O 队列。
🔸PSK 的生命周期与重用
- 建议使用时限:不超过 10 分钟。
- 超过该时限后,创建新的 I/O 队列时 必须重新进行认证生成新的 PSK。
- 可参考 NVMe/TCP Transport 规范 中的 PSK 重用机制(允许同一 PSK 被用于多个队列连接)。
✅ 总结重点
| 主题 | 说明 |
|---|---|
| Secret 表示格式 | "DHHC-1:xx:<Base64>:",用于管理、复制和配置密钥 |
| xx 说明 | "00" 表示直接使用原始密钥;其他(如 "01")表示派生密钥 |
| Base64 编码内容 | 密钥 + CRC-32(用于校验) |
| DH-HMAC-CHAP 可用于 | 认证双方并生成 TLS 所需 PSK |
| PSK 生命周期 | 建议不超过 10 分钟,之后需重新认证 |
如果你需要,我可以为你绘制一张完整的:
🔐 DH-HMAC-CHAP + TLS 协议认证流程图(含 PSK 派生)
或者继续讲解 8.13.6(Advanced Security Features) 的内容,你更想看哪个?