持久内存与安全机制 - 第398页
NVME2.0协议解读 1 min read

持久内存与安全机制 - 第398页

Blog Author

我们现在来深入解析 NVMe Base Specification 2.0b8.13.5.88.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) 的内容,你更想看哪个?