跳到主要内容

2.15. Authentication of the IKE SA (IKE SA 的认证)

2.15. Authentication of the IKE SA (IKE SA 的认证)

若不使用可扩展认证 (见 2.16 节), 对等体通过对一块数据签名 (或如本节稍后所述, 以填充后的共享秘密为密钥进行 MAC) 完成相互认证. 在这些计算中, IDi' 与 IDr' 为完整 ID 载荷, 不含固定首部. 对于响应方, 待签名字节从第二条消息 (IKE_SA_INIT 响应) 首部中第一个 SPI 的第一个八位组开始, 到最后一个载荷的最后一个八位组结束. 为计算签名, 其后附加发起方的 nonce Ni (仅为值, 非包含它的载荷) 以及值 prf(SK_pr, IDr'). 注意 Ni 与 prf(SK_pr, IDr') 均不传输. 类似地, 发起方对第一条消息 (IKE_SA_INIT 请求) 签名, 从首部第一个 SPI 的第一个八位组开始, 到最后一个载荷的最后一个八位组结束. 为计算签名, 其后附加响应方 nonce Nr 以及值 prf(SK_pi, IDi'). 交换的安全性要求各方签署对方的 nonce, 这一点至关重要.

发起方待签名字节可描述为:

InitiatorSignedOctets = RealMessage1 | NonceRData | MACedIDForI
GenIKEHDR = [ four octets 0 if using port 4500 ] | RealIKEHDR
RealIKEHDR = SPIi | SPIr | . . . | Length
RealMessage1 = RealIKEHDR | RestOfMessage1
NonceRPayload = PayloadHeader | NonceRData
InitiatorIDPayload = PayloadHeader | RestOfInitIDPayload
RestOfInitIDPayload = IDType | RESERVED | InitIDData
MACedIDForI = prf(SK_pi, RestOfInitIDPayload)

响应方待签名字节可描述为:

ResponderSignedOctets = RealMessage2 | NonceIData | MACedIDForR
GenIKEHDR = [ four octets 0 if using port 4500 ] | RealIKEHDR
RealIKEHDR = SPIi | SPIr | . . . | Length
RealMessage2 = RealIKEHDR | RestOfMessage2
NonceIPayload = PayloadHeader | NonceIData
ResponderIDPayload = PayloadHeader | RestOfRespIDPayload
RestOfRespIDPayload = IDType | RESERVED | RespIDData
MACedIDForR = prf(SK_pr, RestOfRespIDPayload)

注意签名涵盖全部载荷, 包括本文档未定义的载荷类型. 若交换的第一条消息多次发送 (例如带响应方 cookie 或不同 Diffie-Hellman 群), 以该消息的最新版本为准进行签署.

消息 3 与 4 可以可选地包含证书或证书链, 以证明用于计算数字签名的密钥属于 ID 载荷中的名称. 签名或 MAC 使用签名者密钥类型所决定的算法, 并在 Authentication 载荷的 Auth Method 字段中规定. 并不要求发起方与响应方使用相同密码算法签名. 算法选择取决于各方密钥类型. 特别地, 发起方可能使用共享密钥, 而响应方可能拥有公钥签名密钥与证书. 若使用共享秘密认证, 常见 (但非必须) 为两个方向使用同一密钥.

注意: 仅从用户口令派生共享密钥而不引入其他随机源, 是常见但通常不安全的做法. 用户口令往往不足以抵抗字典攻击, 而本认证方法并不阻止此类攻击. (在引导与 IKE SA 中使用基于口令的认证时, 应采用 2.16 节的方法, 其设计用于防止离线字典攻击.) 预共享密钥所含不可预测性须至少与所协商最强密钥相当. 使用预共享密钥时, AUTH 值计算为:

发起方:

AUTH = prf( prf(Shared Secret, "Key Pad for IKEv2"),
<InitiatorSignedOctets>)

响应方:

AUTH = prf( prf(Shared Secret, "Key Pad for IKEv2"),
<ResponderSignedOctets>)

其中字符串 "Key Pad for IKEv2" 为 17 个 ASCII 字符, 无空字符终止. 共享秘密可为可变长度. 增加填充串是为了: 若共享秘密由口令派生, IKE 实现不必以明文存储口令, 而可存储 prf(Shared Secret,"Key Pad for IKEv2"), 该值不能用作除 IKEv2 外其他协议的口令等价物. 如前所述, 仅从口令派生共享秘密并不安全. 采用此构造是因为预期仍会有人这样做. 提供共享秘密的管理接口必须接受至少 64 八位组的 ASCII 串, 且在用作共享秘密前不得添加空终止符. 还必须接受共享秘密的十六进制编码. 管理接口可以接受其他编码, 若已规定将编码翻译为二进制串的算法.

EAP 认证有两种类型 (见 2.16 节), 各类型在上述 AUTH 计算中使用不同值. 若 EAP 方法为密钥生成型, 在计算中以主会话密钥 (master session key, MSK) 替代共享秘密. 对于非密钥生成型方法, 分别在两次 AUTH 计算中以 SK_pi 与 SK_pr 替代共享秘密.