跳到主要内容

3.4. The KRB_SAFE Exchange (KRB_SAFE 交换)

3.4. The KRB_SAFE Exchange (KRB_SAFE 交换)

KRB_SAFE 消息可以 (MAY) 由需要能够检测其交换的消息修改的客户端使用。它通过包含用户数据和一些控制信息的键控抗碰撞校验和来实现这一点。校验和使用加密密钥 (通常是通过子密钥协商的最后一个密钥, 或者如果没有发生协商则是会话密钥) 进行键控。

3.4.1. KRB_SAFE 消息的生成

当应用程序希望发送 KRB_SAFE 消息时, 它收集其数据和适当的控制信息并计算它们的校验和。校验和算法应该是强制实现的键控校验和, 与用于子会话或会话密钥的加密系统一起使用。校验和使用子会话密钥 (如果存在) 或会话密钥生成。某些实现对 KRB_SAFE 消息使用不同的校验和算法, 但以可互操作的方式这样做并不总是可能的。

KRB_SAFE 消息的控制信息包括时间戳和序列号。使用 KRB_SAFE 消息的应用程序的设计者必须 (MUST) 至少选择两种机制之一。此选择应该 (SHOULD) 基于应用程序协议的需求。

当发送的所有消息都将被对等方接收时, 序列号很有用。当前需要连接状态来维护会话密钥, 因此维护下一个序列号不应该带来额外的问题。

如果应用程序协议预期容忍丢失的消息而不重新发送它们, 则使用时间戳是适当的重放检测机制。对于多播协议, 其中所有对等方共享公共子会话密钥, 但某些消息将发送到对等方的子集, 使用时间戳也是适当的机制。

计算校验和后, 客户端然后以第 5.6.1 节中指定的消息格式将信息和校验和传输给接收者。

3.4.2. KRB_SAFE 消息的接收

当应用程序接收到 KRB_SAFE 消息时, 它按如下方式验证它。如果发生任何错误, 将报告错误代码供应用程序使用。

首先通过验证协议版本和类型字段是否分别匹配当前版本和 KRB_SAFE 来检查消息。不匹配会生成 KRB_AP_ERR_BADVERSION 或 KRB_AP_ERR_MSG_TYPE 错误。应用程序验证使用的校验和是抗碰撞的键控校验和, 它使用与子会话或会话密钥兼容的密钥 (或与从会话或子会话密钥派生的应用程序密钥兼容)。如果不是, 则生成 KRB_AP_ERR_INAPP_CKSUM 错误。发送者的地址必须 (MUST) 包含在控制信息中; 接收者验证操作系统报告的发送者地址是否与消息中的发送者地址匹配, 以及 (如果指定了接收者地址或接收者需要地址) 接收者的地址之一是否作为接收者地址出现在消息中。为了与网络地址转换一起工作, 发送者可以 (MAY) 对发送者地址使用第 8.1 节中指定的方向地址类型, 并且不包括接收者地址。任一情况的匹配失败都会生成 KRB_AP_ERR_BADADDR 错误。然后检查时间戳和 usec 和/或序列号字段。如果预期时间戳和 usec 但不存在, 或者如果它们存在但不是当前的, 则生成 KRB_AP_ERR_SKEW 错误。时间戳不需要严格排序; 它们只需要在偏差窗口内。如果服务器名称以及来自 Authenticator 的客户端名称, 时间和微秒字段与最近看到的 (发送或接收的) 任何此类元组匹配, 则生成 KRB_AP_ERR_REPEAT 错误。如果包含不正确的序列号, 或者如果预期序列号但不存在, 则生成 KRB_AP_ERR_BADORDER 错误。如果既不存在时间戳和 usec 也不存在序列号, 则生成 KRB_AP_ERR_MODIFIED 错误。最后, 在数据和控制信息上计算校验和, 如果它与接收到的校验和不匹配, 则生成 KRB_AP_ERR_MODIFIED 错误。

如果所有检查都成功, 应用程序可以确信消息是由其对等方生成的, 并且在传输过程中未被修改。

实现应该 (SHOULD) 接受它们实现的任何校验和算法, 这些算法既具有足够的安全性, 又与子会话或会话密钥兼容的密钥。未键控或非抗碰撞的校验和不适合此用途。