跳到主要内容

6.7.4. Keyed SHA1 and Meticulous Keyed SHA1 Authentication (密钥 SHA1 和严格密钥 SHA1 认证)

6.7.4. Keyed SHA1 and Meticulous Keyed SHA1 Authentication (密钥 SHA1 和严格密钥 SHA1 认证)

密钥 SHA1 和严格密钥 SHA1 认证机制与其他协议中使用的机制非常相似。在这些认证方法中, 在每个系统中配置一个或多个秘密密钥 (带有相应的密钥 ID)。其中一个密钥包含在对传出 BFD 控制包计算的 SHA1 [SHA1] 哈希中, 但密钥本身不在数据包中携带。为了帮助避免重放攻击, 每个数据包中还携带一个序列号。对于密钥 SHA1, 序列号偶尔递增。对于严格密钥 SHA1, 序列号在每个数据包上递增。

如果密钥 ID 与配置的密钥之一匹配, 包括所选密钥的 SHA1 哈希与数据包中携带的哈希匹配, 并且序列号大于或等于最后接收的序列号 (对于密钥 SHA1) 或严格大于最后接收的序列号 (对于严格密钥 SHA1), 则接收系统接受数据包。

使用密钥 SHA1 和严格密钥 SHA1 认证的传输

Auth Type 字段必须设置为 4 (密钥 SHA1) 或 5 (严格密钥 SHA1)。Auth Len 字段必须设置为 28。Auth Key ID 字段必须设置为当前认证密钥的 ID。Sequence Number 字段必须设置为 bfd.XmitAuthSeq。

认证密钥值是最多 20 字节的二进制字符串, 并且必须放入 Auth Key/Hash 字段中, 根据需要用尾随零字节填充。为了互操作性, 配置密钥的管理接口必须接受 ASCII 字符串, 并且还应该允许以十六进制形式配置任何任意二进制字符串。可以支持其他配置方法。

必须在整个 BFD 控制包上计算 SHA1 哈希。生成的哈希必须在传输之前存储在 Auth Key/Hash 字段中 (替换秘密密钥, 秘密密钥不能在数据包中携带)。

对于密钥 SHA1, bfd.XmitAuthSeq 可以以循环方式递增 (当被视为无符号 32 位值时)。bfd.XmitAuthSeq 应该在会话状态改变时递增, 或者当传输的 BFD 控制包携带与先前传输的数据包不同的内容时递增。何时递增 bfd.XmitAuthSeq 的决定超出了本规范的范围。请参阅下面标题为 "安全注意事项" 的部分进行讨论。

对于严格密钥 SHA1, bfd.XmitAuthSeq 必须以循环方式递增 (当被视为无符号 32 位值时)。

使用密钥 SHA1 和严格密钥 SHA1 认证的接收

如果接收到的 BFD 控制包不包含认证段, 或者 Auth Type 不正确 (密钥 SHA1 为 4 或严格密钥 SHA1 为 5), 则必须丢弃接收到的数据包。

如果 Auth Key ID 字段与配置的认证密钥的 ID 不匹配, 则必须丢弃接收到的数据包。

如果 Auth Len 字段不等于 28, 则必须丢弃数据包。

如果 bfd.AuthSeqKnown 为 1, 则检查 Sequence Number 字段。对于密钥 SHA1, 如果序列号位于 bfd.RcvAuthSeq 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包。对于严格密钥 SHA1, 如果序列号位于 bfd.RcvAuthSeq+1 到 bfd.RcvAuthSeq+(3Detect Mult) 包含的范围之外 (当被视为无符号 32 位循环数空间时), 则必须丢弃接收到的数据包。

否则 (bfd.AuthSeqKnown 为 0), bfd.AuthSeqKnown 必须设置为 1, bfd.RcvAuthSeq 必须设置为接收到的 Sequence Number 字段的值, 并且必须接受接收到的数据包。

用接收到的 Auth Key ID 字段选择的认证密钥替换 Auth Key/Hash 字段的内容。如果整个 BFD 控制包的 SHA1 哈希等于 Auth Key/Hash 字段的接收值, 则必须接受接收到的数据包。否则 (哈希与 Auth Key/Hash 字段不匹配), 必须丢弃接收到的数据包。