摘要

  • RFC 2402 的认证头 ICV 针对经过准备的报文视图计算:不变字段直接覆盖,可预测的可变字段采用预期到达值,不可预测的可变内容在计算时以零替代。
  • ICV 匹配不证明所有线上头字段从未改变。分片发生在出站 AH 之后,重组发生在入站 AH 之前;接收方还可以按安全关联关闭防重放,后续策略与应用结果也另有证据。

设想一个 TTL 为 64 的 IPv4 报文。路由器正常转发时会把它减一。若接收方按看到的字节原样计算,合法变化就会让认证失败;若完全删掉 TTL,它在报文结构中的位置和长度又不再受到约束。RFC 2402 的办法是:在线上报文中保留真实 TTL,只在 ICV 计算副本里把相应八位填成零。

这正是 1998 年 IP 认证头对“认证报文”的精确定义。AH 提供无连接完整性和数据源认证,并支持由接收方按安全关联选择的防重放服务。它不提供机密性。它覆盖上层数据和尽可能多的 IP 头,但 RFC 自己把头部保护称为零碎的,因为有些字段必然或可能在途中改变。

AH 固定部分包括下一头、长度、保留位、安全参数索引 SPI 和序列号,之后是可变长认证数据。SPI、目的地址与 AH 协议一起选择单向安全关联,关联给出算法与密钥。序列号始终存在并由发送方递增,即使接收方并未启用防重放检查。

ICV 输入分成三类。不变 IP 字段和上层数据按原值进入。途中会变、但到达值可预测的字段,先被排列成接收方应见的状态。不可预测的可变字段则填零。认证数据字段本身也必须暂时为零,因为结果产生之前不可能先包含结果。

置零不是删除。RFC 2402 特别说明,保留这些字节可以维持对齐,也让字段长度继续处于认证结构之内,哪怕其实际内容不被保护。由此形成的计算视图与报文具有相同结构轮廓,却并非每个位置都保留线上值。“规范化视图”是后来的解释用语;RFC 使用的是不变、可变但可预测、可变三种分类。

IPv4 的清单把差别落到具体字段。版本、头长、总长、标识、表示 AH 的协议值、源地址和普通目的地址按原值进入 ICV。采用松散或严格源路由时,目的地址虽会变化,却可按接收端最终状态预测。服务类型、标志、分片偏移、TTL 与头校验和则被置零。文档解释,路由器已知会改 TOS,可能设置 DF,正常情况下会减少 TTL,头校验和也会随这些变化更新。

这并不表示被排除字段不重要,而是 AH 不能诚实承诺它们抵达时仍保持原值。因此,有效 ICV 可以与较低 TTL 或其他许可的可变值同时存在。它证明双方对准备后输入的一致性,不证明整个线上图像静止不动。

IPv6 以另一组字段执行同样原则。1998 年模型把 Class、Flow Label 与 Hop Limit 置零;带路由头的目的地址属于可变但可预测。逐跳选项和目的选项各自携带一个途中可变位。若 Option Data 可变,计算时把它视为零字节,但 Option Type 与长度仍被覆盖。不变选项的内容则直接进入 ICV。未来选项规范必须正确说明自身的可变处理,才能接入这份共同视图。

填充又展示了计算与传输的区别。认证数据中的显式填充随报文发送,也被纳入 ICV。某些算法还要求为了块边界附加隐式零填充;这些字节参与计算,却不在线上传输。认证输入因此既可能含有替换值,也可能含有根本未上网的字节。

分片说明 AH 验证的单位是重建后的数据报,而不是每个途中碎片。传输模式先对完整 IP 数据报应用 AH,随后才允许 IP 分片;路由器仍可把受保护报文拆开。接收方必须先重组,再交给 AH。若交到 AH 的对象仍表现为分片,就要丢弃并记录。隧道模式则有另一层次:外层 AH 可以保护一个载荷,而该载荷本身可能是已分片的内层 IP 报文。

入站校验重新构造同一视图。接收方选择关联、保存报文携带的 ICV,把认证数据和不可预测的可变字段置零,在需要时补上隐式零字节,再按算法重新计算并比较。若启用了防重放,可以先筛选候选序列号,但只有 ICV 成功才更新窗口。若防重放未启用,序列号存在本身不证明发生过重放判定。

RFC 2402 把 ICV 匹配的数据报称为在 AH 这一步有效并被接受。外围的 RFC 2401 架构仍要求在转发或交付之前完成入站策略核验,应用是否接受又在更后面。证据链应依次保存关联与算法、发送方计算视图、ICV 写入、可能的分片、重组、接收方重建与比较、可选重放判断、策略许可和应用结果。

这份规范属于历史。它取代 RFC 1826,后来又被 RFC 4302 与 RFC 4305 取代。HMAC-MD5 和 HMAC-SHA-1 的当年互操作要求不能当成今天的密码建议。RFC 4302 延续了头部只能部分覆盖的原则,同时修改了关联查找、扩展序列号与算法管理。

借用 Lu Heng 关于运行代码和现实层的后世分析,认证标签的效力来自发送方与接收方实际构造并比较的那份视图。这不是 RFC 的原话,却能防止“已认证”三个字吞没被明确排除的字段、可选的检查,以及仍未发生的下游结果。

来源