Forward Secrecy(前向保密)在任何加密系统中,都是一个非常重要的概念和非常理想的财产,密钥交换中支持前向保密的只有ECDHE和DHE协议。
- 简单概念:“once encrypted,always encrypted”
- 如果没有前向保密:(PSK、RSA、DH、ECDH不能提供前向保密)
- 私钥文件必须被永久保护
-
-
例如:Client和Server正在进行RSA密钥交换,中间红色代表的事中间人攻击。Client随机生成种子值(Seed Value),用Server的公钥进行加密,并在线传输给Server(因为是在线的,所以传输过程中,任何中间人可以得到加密的种子值,对我们来说这没关系,因为要有Server的私钥才能提取原始种子值),这让Client和Server能够用相同的种子值派生出会话密钥,以此来保护双方之间的数据传输。中间人虽然能获取传输中的数据,但没有会话密钥就无法提取信息。
现在假设过去了一段时间,Server打算更换新的证书(或者说新的公钥和私钥),而旧的密钥可能存在于离职员工的电脑或者不再使用的硬盘里,那么有可能这个旧的私钥会泄露给中间人,然后这个中间人就能用这个私钥解密种子值,并且生成会话密钥(和Client和Server相同)。这意味着,用该会话密钥进行传输的数据会被中间人获取并解密,因此,私钥文件必须要永久进行保护,不能泄露。
-
-
- 如果将来有一天密钥泄露了,中间人就能够解密过去发送过的数据
- ECDH和DH使用静态(意味着不会改变)的启动参数(starting parameters,即Prime number、Generator、Private Value)
- 存储在证书和私钥文件里(同样意味着私钥要永久保存)
- 上图所示Diffie-Hellman密钥交换,Client和Server就素数(Prime number)和生成器(Generator)达成一致,两者是以明文形式在线传输,这也就表明中间人能获取到P和G;随后,Client和Server随机生成私钥,并用这三个值生成对应公钥,然后在线发送给对方(同样,中间人也能获取);之后,Client将自己的私钥和对方的公钥结合,生成Seed,Server同理(要注意的事,种子值由私钥所创建)
- 私钥文件必须被永久保护
- 有了前向加密:(DHE、ECDHE)
- 在种子值被计算出来后,初始的Diffie-Hellman值(P、G、Private value)就被丢弃了
- 意味着,不可能重新创建种子值
- TLS 1.3+将需要前向保密
- Secure Recommended
- 在种子值被计算出来后,初始的Diffie-Hellman值(P、G、Private value)就被丢弃了
参考文献
1、Practical Networking.net:Practical TLS