摘要

  • 每个受 NTS 保护的请求必须恰好带一个唯一标识符;其内容由密码学安全随机数生成器产生,长度至少 32 个八位组,服务器在响应中原样回送。
  • 客户端只有在该值匹配一项尚未完成的请求、且数据包能用相应的服务器到客户端密钥通过认证时,才继续处理响应。
  • 这套证据用于关联请求与响应并发现重放,不是账号、用户或设备的持久身份,也不是 NTS Cookie,更不保证时间值本身正确。

给一个未决问题的临时回执

设想客户端几乎同时收到两个格式完整的时间响应。其中一个确实回答了刚刚发出的请求,另一个则是攻击者早先录下、此刻重新投递的旧响应。旧包在当年生成时可能完全合法。只问“它是否曾由正确的密钥认证”,还不足以判断它是不是当前问题的答案。

RFC 8915 为客户端增加了一张由自己签发的临时取件凭据。每个受保护请求必须包含且只包含一个 Unique Identifier 扩展字段。字段主体必须由密码学安全随机数生成器产生,长度不少于 32 个八位组。服务器验证请求后,在响应中放入且只放入一个同类字段,并逐字节复制客户端给出的值。

响应到达时,两项检查缺一不可:标识符必须对应客户端仍列为未决的请求,数据包还必须用与该请求关联的 S2C 密钥通过认证。任何一项失败,数据包都要在进一步处理前丢弃。于是,一张旧的真凭据也不能顶替当前回执。

这个字段不得加密,却必须认证。它位于认证器之前、属于 AEAD 完整性覆盖的数据,所以旁观者能够看到它,并不意味着能够篡改它后仍得到有效响应。保密性回答“别人能不能读”,完整性回答“别人能不能悄悄改”;两者不能混为一谈。

因此,“唯一”的适用范围很窄,也很准确:它帮助某个客户端区分当前未决请求与别的请求。它不是服务器分配的会话号,不是登录凭证,也不陈述请求背后是哪一个人或哪一台设备。请求被接受或过期后,它的证明任务就结束了。

为什么原始时间戳不够强

NTP 并非从前没有响应关联。RFC 5905 定义了 64 位的 Origin Timestamp,记录请求从客户端发出的时间。服务器把它带回,客户端再和发送状态比较,用于识别伪造、重复或重放的数据包。

RFC 8915 没有否定这套历史机制,而是指出它不适合作为密码学挑战值。64 位空间较小;更重要的是,根据实现方式,其中大部分位可能可以预测。时间戳擅长表达时间和参与时延计算,却不天然具备对抗猜测所需的不可预测性。

新字段把两种职责拆开。至少 32 个八位组意味着字段长度不少于 256 位,内容又必须来自密码学安全生成器,因而能提供更合适的不可预测性和抗碰撞能力。不过,RFC 4086 也提醒:输出长达 256 位,不等于自动拥有 256 位熵。若种子状态狭小或可猜,外表随机的序列仍可能不安全。真正要审计的既有长度,也有熵源和生成器健康状况。

RFC 8915 允许在不使用 NTS 时单独采用该字段,以帮助抵御路径外攻击者伪造响应。但在 NTS 内,较强的结论来自两张相互补充的凭据:随机回声说明响应声称回答哪项未决请求,S2C 认证说明数据包来自相应的密钥上下文。任何一张都不应被包装成完整证明。

TLS、Cookie 和回声各管一件事

第一阶段 NTS-KE 运行在 TLS 之上,完成初始服务器认证、参数协商和密钥导出,之后 TLS 连接关闭。稍后 NTP 请求里的 Unique Identifier 不是证书,也没有重新定义服务器或客户端身份。

NTS Cookie 处理第二类问题。客户端把服务器先前提供的不透明 Cookie 带回,服务器据此恢复 AEAD 算法和双向密钥,而无需保存逐客户端状态。Sofia Ren 此前关于 Dieter Sibold 的文章已经沿着 TLS 关闭后的这条状态迁移路径展开。那篇文章的 Cookie 用于恢复关联;本文的唯一标识符只用于把一个响应对回一个仍在等待的请求。

认证器承担第三类工作。在请求中,Cookie 与唯一标识符都受认证而不加密;在响应中,唯一标识符依然可见,新 Cookie 则放入加密且认证的扩展区。协议有意为这些对象安排了不同的保密边界。把它们合并成“客户端身份”,等于抹去设计本身。

这也划定了隐私判断的范围。持久标识符会把长时间的行为串在一起;这里的值理应逐请求刷新、难以预测。重复使用、碰撞或无限期保留原值会带来运维和隐私问题,但那是实现偏离预期,不是标准把它定义成了身份。

响应真实,不等于时间正确

重放防护堵住了一种错误时间注入方式:攻击者不能简单拿旧的受保护响应来满足新的请求。它没有堵住所有风险。RFC 7384 分开讨论重放、篡改、冒充、时延操纵和上游主时钟来源遭攻击。一个响应可以是当前生成且认证有效的,但服务器依赖的时间源仍可能出错;路径时延也可能被恶意改变。

RFC 8633 因而把时间源选择和监测列为独立责任。只依赖一个来源时,来源的错误会直接传给客户端;足够多且相互独立的来源、分歧监测和运维调查仍不可缺少。唯一标识符证明的是“这份受保护响应对应这项未决请求”,不是“这个时间一定是真的”。

来源