持久内存 - 🧠 一、图 444 符号含义全面解释 (第390页)
NVME2.0协议解读 1 min read

持久内存 - 🧠 一、图 444 符号含义全面解释 (第390页)

Blog Author

很好,现在我们继续深入分析 NVMe Base 2.0b 中的 DH-HMAC-CHAP 协议数学机制与消息流程逻辑(第 8.13.5.1 页图 444)。我们将结合数学符号、通信流程和身份验证过程进行完整的学习理解和实现思路梳理


🧠 一、图 444 符号含义全面解释

符号 含义
NQNc, NQNh 控制器所在 NVM Subsystem 的 NQN,和主机的 NQN(唯一身份)
Kc, Kh 控制器与主机各自的 DH-HMAC-CHAP 密钥,通常对称预共享
p, g Diffie-Hellman 的模数 p 与基数 g,由所选的 DH Group 决定
x, y 控制器和主机各自随机生成的私钥指数(用于计算公钥)
gx mod p, gy mod p DH 公钥(分别由 x、y 生成)
C1, C2 双方生成的随机质询码(Challenge)
Ca1, Ca2 扩展后的质询码,通常是 C1/C2 加入序列号等扩展字段
S1, S2 双方序列号(32 位),用于挑战唯一性和抗重放
R1, R2 对 C1 和 C2 的响应(Response),用 HMAC 计算得到
T_ID 认证事务唯一标识符
H() 单向哈希函数(如 SHA-256、SHA-512)
HMAC(K, Str) 以 K 为密钥、对数据 Str 执行 HMAC 运算
|| 表示字符串拼接
KS 会话密钥(由 DH 协议生成),用于后续 TLS 通信中的 PSK

🔐 二、整个认证过程的逻辑顺序(由主机发起)

🌐 步骤 1:主机 → 控制器:AUTH_Negotiate

主机声明: - 我支持 DH-HMAC-CHAP - 支持哪些哈希函数(HashIDList),哪些 DH 群组(DHgIDList) - 是否希望认证结束后 附加安全通道(TLS/IPsec)

控制器接收后,挑一个组合(哈希 + DH group)继续认证。


💡 步骤 2:控制器 → 主机:DH-HMAC-CHAP_Challenge

控制器回应: - T_ID:相同事务号 - HashIDDHgID:所选哈希函数与 DH 群组 - S1, C1: 控制器随机序列号和挑战 - gx mod p: 控制器 DH 公钥 - 若选择 NULL DH,则跳过 DH 协议部分(降级为 HMAC-CHAP)


💬 步骤 3:主机 → 控制器:DH-HMAC-CHAP_Reply

主机响应: - 使用 Kh 密钥,对 C1 || S1 || gx mod p || NQNc || NQNh 做 HMAC 得出 R1 - 附带主机公钥 gy mod p - 如果要求双向认证,还生成 S2, C2 发送回去,控制器也要回应


✅ 步骤 4:控制器 → 主机:DH-HMAC-CHAP_Success1

控制器验证: - 使用主机公钥 gy、自身私钥 x,生成共享密钥 KS - 对 C2 || S2 || gy mod p || NQNh || NQNc 做 HMAC,验证主机身份 - 如果是双向认证,还会计算 R2 返回给主机 - 若验证失败,发送 AUTH_Failure1 并断开连接


🔁(可选) 步骤 5:主机 → 控制器:DH-HMAC-CHAP_Success2

主机可再验证控制器的回应 R2,用于双向认证闭环。


🔑 三、关键点总结与实现建议

📌 安全性保障点:

安全特性 依赖机制
抗重放 S1S2 序列号参与计算
身份验证 HMAC 使用预共享密钥,绑定身份
机密性 DH 密钥协商生成 KS
完整性验证 Hash + HMAC 结合
支持双向认证 可选 C2/R2 流程

🎯 四、举例:计算响应 R1 的表达式

R1 = HMAC(Kh, C1 || S1 || gx mod p || NQNc || NQNh)

其中: - Kh 是主机持有的共享密钥 - gx mod p 是控制器 DH 公钥 - NQNc/NQNh 是双方的 NQN,用于绑定身份,防止中间人攻击


🧪 五、下一步建议

如你愿意,我可以继续帮你解析:

  1. 8.13.5.2 Negotiation 消息结构与参数字段解释
  2. 8.13.5.3 ~ 5.6:消息格式、响应验证公式、认证失败情况
  3. 8.13.5.9:如何将认证生成的 KS 会话密钥用于后续 TLS 通道建立(组合认证 + 加密)

或者我可以画出 DH-HMAC-CHAP 的完整通信流程图。需要吗?😄