什么是前向安全性
前向安全性特指在长期密钥(Long-term Key)被泄露的情况下,过去所进行的加密通信依然安全,攻击者无法解密之前的通信内容。
简单来说,即使你现在的密钥被盗了,你以前的聊天记录也不会被翻出来看。
传统的通过非对称加密来协商对称加密密钥的算法(参见:构建互联网的信任基石:TLS与数字证书技术探源)存在前向安全性问题。
详细来说,攻击者是这样做的:
DH算法解决前向安全性问题
产生前向安全性问题的本质原因是:对称密钥(确切地说,是用于产生对称密钥的关键元素–随机数)通过非对称加密的方式传输给对方。这导致一旦私钥泄露,就可以解密历史抓包文件,得到对称密钥,继而解密报文。
是否有一种即使私钥泄漏,也不用担心对称密钥被拿到的算法?
答案是:基于Ephemeral Diffie-Hellman(DHE/ECDHE)的密钥交换:
- 客户端和服务器协商一个临时的密钥对。
- 会话密钥不是通过私钥解密得到的,而是通过 DH 协议动态计算出来的。
- 这些临时密钥在每次连接中都是不同的,且永远不会通过网络发送。所以,你就算拥有服务器证书和私钥,也拿不到用于解密的会话密钥!
ECDHE算法说明:
- 客户端
- 协商椭圆曲线(g, n)
- 客户端生成 x_c 并发送 X_c = g^x_c mod n
- 服务器
- 协商椭圆曲线(g, n)
- 服务器生成
x_s
并发送X_s = g^x_s mod n
- 双方使用对方的公钥 + 自己的私钥计算共享密钥
- 客户端:
Z = (X_s)^x_c mod n
- 服务器:
Z = (X_c)^x_s mod n
- 客户端:
- 客户端和服务器计算出了相同的
Z = g^x_c^x_s mod n
- 基于共享密钥 Z 再生成实际会话中使用的 session key
ECDHE的神奇之处在于:对话的双方最终都得到了相同的密钥Z,而这个密钥Z却没有经过网络的传输。
g
和n
都已经经过协商公开,所以关键是:任意一方的( x_s
或x_c
)都没有通过网络来发送,取而代之的,通过网络发送的是X_c = g^x_c mod n
和X_s = g^x_s mod n
(从数学原理上说:X_c
很难逆向推出x_c
)。
每个会话的密钥都是临时生成的,各不相同。因此私钥的泄漏不能解密旧报文。也就没有了前向安全性问题。