6.4. Data Integrity (数据完整性)
6.4. Data Integrity (数据完整性)
数据完整性通过在每个数据包中包含一个 MAC 来保护, 该 MAC 从共享密钥、数据包序列号和数据包内容计算得出.
消息认证算法和密钥在密钥交换期间协商.初始时, 不会有 MAC 生效, 其长度必须为零.密钥交换后, 所选 MAC 算法的 mac 将在加密之前从数据包数据的连接计算:
mac = MAC(key, sequence_number || unencrypted_packet)
其中 unencrypted_packet 是不包含 mac 的整个数据包 (长度字段、payload 和 random padding), sequence_number 是一个隐式的数据包序列号, 表示为 uint32.sequence_number 对于第一个数据包初始化为零, 并在每个数据包之后递增 (无论是否使用加密或 MAC).它永远不会重置, 即使稍后重新协商密钥/算法也是如此.每 2^32 个数据包后它会回绕到零.数据包 sequence_number 本身不包含在通过网络发送的数据包中.
每个方向的 MAC 算法必须独立运行, 并且实现必须允许为两个方向独立选择算法.然而在实践中, 建议两个方向使用相同的算法.
从 MAC 算法得到的 mac 值必须在不加密的情况下作为数据包的最后部分传输.mac 的字节数取决于所选择的算法.
当前定义了以下 MAC 算法:
hmac-sha1 REQUIRED HMAC-SHA1 (摘要长度 = 密钥长度 = 20)
hmac-sha1-96 RECOMMENDED HMAC-SHA1 的前 96 位 (摘要长度 = 12, 密钥长度 = 20)
hmac-md5 OPTIONAL HMAC-MD5 (摘要长度 = 密钥长度 = 16)
hmac-md5-96 OPTIONAL HMAC-MD5 的前 96 位 (摘要长度 = 12, 密钥长度 = 16)
none OPTIONAL 无 MAC; 不推荐
"hmac-" 算法在 [RFC2104] 中描述."-n" MAC 仅使用结果值的前 n 位.
SHA-1 在 [FIPS-180-2] 中描述, MD5 在 [RFC1321] 中描述.
可以按照 [SSH-ARCH] 和 [SSH-NUMBERS] 中的规定定义其他方法.