VPN 的前向保密:被盗密钥能解开什么
前向保密限制了日后被盗的身份密钥能泄露多少已录制的会话。它并不保护已被入侵设备上的实时明文。
今天录下一段加密隧道,明年偷走服务器的长期私钥,再试着解密这段录像。前向保密说的是:被盗的那把密钥本身并不够用。它是关于已录制会话和特定秘密的陈述,而不是关于隧道当时很安全的泛泛承诺。把范围说清楚,这个术语才有用。
问题针对的是录像,而不是实时会话
长期密钥用来标识对端并签署握手。会话密钥加密真正的流量,而在前向保密的设计里,它们由双方新生成、随后丢弃的密钥交换材料派生。只拿到长期密钥的攻击者无法重建那些已丢弃的值。拿到实时会话状态的攻击者仍然可以,所以这项保证针对的是过去而不是当下。
这个说法是有条件的:只有临时秘密确实被销毁、协议也确如你所想时,它才成立。混合部署可能在某条隧道上满足它,在另一条上却不满足。
一个秘密不应能重建其余秘密
检查协商出来的模式,而不是营销页面。握手输出会写明密钥交换和协议版本。
openssl s_client -connect vpn.example.com:443 -tls1_3 -brief
swanctl --list-sass_client 的摘要会显示 TLS 版本和密钥交换组,临时组就是前向保密密钥协商的可见标志。swanctl 列表会显示 IKE 与 CHILD 关联及其密钥更新计时器,因此你能看出部署是否按计划更新密钥。静态 RSA 密钥交换或旧的兼容模式,无论密码套件叫什么名字,都会失去这一性质。记录你观察到的模式,而不是厂商宣传的那一种。
更新密钥并不自动等于前向保密
隧道多久更新一次密钥,与每把密钥如何派生是两个问题。从长期秘密重新生成密钥的设计,可以每分钟更新一次却仍然通不过检验,因为日后的失陷能把它们全部重建。反过来,更新很少的协议,只要每次交换相互独立,仍可能具备前向保密。要看派生方式,而不是更新间隔,也别把很短的重新连接计时器当成密码学保证。
同样的混淆也出现在密码套件的名字上:现代密码套件并不能说明它的密钥是怎么来的。
保证之后仍然可见的东西
前向保密保护的是已录制会话的明文不被日后的密钥失陷解开,对在被入侵端点上读取实时流量的攻击者则毫无作用。它不会从录像里抹掉目的地址、时间或流量大小,也不限制运营方把连接日志保留多久。它也不会把已被入侵的客户端变成可信的客户端,因为攻击者本就待在有明文内容的地方。
当服务商声称具备前向保密时,要问:假定被盗的是哪一个长期秘密,哪些会话秘密仍然拿不到。如果这两个问题都有明确答案,这个说法才有意义。