IKEv1 与 IKEv2 的预共享密钥认证:差别在哪里
两个版本都能证明自己知道预共享密钥而不必把它发出去,但送入不同哈希的输入不同。把两条轨迹并排看。
两台配置了同一预共享密钥的网关完成一次握手,抓包看不到任何秘密经由线路传输。这是人们记住的部分。有意思的部分在于,每个版本究竟计算了哪些东西来证明自己知道这个秘密,因为 IKEv1 与 IKEv2 用不同的输入构造这份证明,并在过程中暴露不同的信息。把两条轨迹并排读一遍,差异就不再只是表面的。
这份证明必须达成什么
Diffie-Hellman 为双方给出一个共同值,任何旁观者同样能算出它的公开那一半。仅凭这一点并不能证明任何身份:完成密钥交换的攻击者与你的网关拥有同一个共同值。认证这一步的意义,是把这次交换绑定到只有预期双方才持有的秘密,以及它们商定的身份与参数上。
正因为有这层绑定,哈希覆盖的范围才不止密钥本身。如果只覆盖秘密,攻击者就能把它重放进一次身份或提案都不同的交换。
IKEv1 主模式:先导出 SKEYID,再证明它
主模式共六条消息。第一对协商安全联盟,第二对交换 Diffie-Hellman 公开值与 nonce,第三对则在刚刚建立的加密之下携带身份与认证哈希。RFC 2409 定义了这套构造:使用预共享密钥认证时,SKEYID 由秘密与两个 nonce 导出,后续密钥材料则由 SKEYID、Diffie-Hellman 共同值、cookie 与常量导出。
第五、第六条消息里的哈希,计算对象是 Diffie-Hellman 值、两个 cookie、提案以及发送方身份,并以 SKEYID 为密钥。接收方用自己配置的秘密重新计算一遍。不一致就终止交换,而秘密本身自始至终都不是载荷。
积极模式把同一件事压缩进三条消息,这意味着身份与认证哈希在有加密通道之前就已经上路。对一个可被猜中的秘密来说,这是真实的暴露,而它与秘密是否被传输是两回事。IKEv1 已被 RFC 9395 列为过时,所以旧抓包只能算诊断练习,不是部署目标。
IKEv2:不同的导出方式与不同的 AUTH 载荷
IKEv2 并不复用 IKEv1 的密钥表。初始 IKE 密钥来自用 nonce 与 Diffie-Hellman 共同值构造的种子,子安全联盟再由它导出。预共享密钥完全不会进入这个种子。
认证随后以 AUTH 载荷出现。对于共享密钥认证,RFC 7296 规定了一种填充形式的秘密:先用固定字符串Key Pad for IKEv2对秘密做一次哈希,再用这个填充后的密钥对已签名的交换数据与身份做哈希。验证方能够重建同一个值;观察者没有秘密就做不到。
注意变化在哪。IKEv1 里,秘密在认证哈希出现之前就被揉进密钥表;IKEv2 里密钥表与秘密无关,证明是一个独立的载荷,绑定在已签名的八位组上。概念上的保证相同,机器不同,这也正是参数名与抓包不能一一对应的原因。
观察者实际能知道什么
两个版本里,Diffie-Hellman 公开值、提案、nonce 与 cookie 都可见。身份在 IKEv1 积极模式里可见,在其他情况下受保护。秘密则永远不可见。
最后这句话有个值得说清的边界。弱的人类自选秘密可以被猜测攻击:攻击者针对候选秘密算出认证值应当是什么,然后比对。IKEv1 积极模式让这件事最便宜,因为证据就在明处;标准也普遍警告低熵秘密。从不传输秘密,和让一个糟糕的秘密变安全,并不是一回事。
这份对比该怎么用
每一对同伴用一条独一无二的秘密,从随机源生成,并沿分发它的同一条配置通道轮换。如果秘密放在发往每个分支的配置模板里,一处失守就是处处失守。
在运维成本可以接受的地方,优先用基于证书的认证,因为它消除了共享密钥被猜的问题,并给每个同伴一个独立身份。预共享密钥若保留,就要够长、范围够窄,并且把 IKE 版本当作安全决策而不是互操作细节。