TLS 握手过程,主要目的是为了协商对称加密
的密钥,因为在最终的通信链路上使用对称加解密会更快。
我们知道,生成最终通信的对称密钥需要三个随机数:
- 客户端随机数
- 服务端随机数
- pre-master
前两个是公开的,那么最重要的就是 pre-master
,在协商过程中如何保证它不会被窃取。为了保证协商安全性、对端可靠性,那么采用非对称加密的方式会更加合适,因为私钥只有服务端持有。
在 TLS 中采用的非对称加密方式主要有如下两种:
- RSA
- ECDHE
而这两种方式的区别,就在于 pre-master
的生成方式不同。
对称和非对称加密
先简单解释一下对称加密和非对称加密。
- 对称加密:只有一个密钥,加解密使用同一个密钥。
- 非对称加密:存在一对公私钥。私钥只有一方持有,公钥是公开的。公钥加密,可以用私钥解密;私钥加密,可以用公钥解密。但私钥加密的方式,一般是用于验证持有私钥的发送人是否可信,因为只有它持有私钥(私钥泄露了另算)。当接收方用公钥能正常解密时,则可认为是由
公钥匹配的私钥
所加密的数据,也就可认为发送方可信。另外,由于公钥所有人都可以获取,所以不会使用私钥加密敏感数据,因为所有人都可解密。
注:即使接收方用公钥能正常解密,但这并不能完全保证发送方就是接收方想要通信的一方,因为接收方不能确认公钥的
端正确性
,只是和发送方的私钥配对而已
,发送方可以被伪装。因此在握手过程中又引入了证书校验
的过程。这一节中我们暂且不讲。
RSA 握手
如果双方使用传统的 RSA
算法进行密钥交换,那么 pre-master
是由客户端生成的一个随机数,然后用服务器公钥
加密后发给服务端,服务端用私钥解密得到 pre-master
。
双方再根据 client-random + server-random + pre-master
三个参数计算出主密钥 master-key
。
流程图如下:
RSA.png但是这种方式会存在安全问题,它不具有前向安全性
。那什么是前向安全性?也就是指历史数据的安全性,不会被破解。
假设一个黑客收集了很多历史数据,当他破解服务端私钥后,可以计算出 pre-master
,从而根据历史数据中的 client-random + server-random
计算出密钥,然后就可解密所有之前的加密数据。并且,由于私钥是固定的,在后续新的会话中,仍然可以获取 pre-master,继续截获信息。所以 RSA 并不安全。
ECDHE 握手
而现在主流的 TLS 握手算法,一般会选择安全性更强的 ECDHE
实现密钥交换,即椭圆曲线算法,相比 RSA 算法来说具有前向安全性
。
因为在每次握手过程中,服务端和客户端都重新会生成 ECDHE 算法的参数,也就是一对公私钥,并且是一次一密
。即使黑客截获了当前会话,那也只能监听该次通信内容。
流程图如下:
ECDHE.png从图中我们可以看到,在服务端发送 Server Certificate
后,多了一步 Server Key Exchange
的过程。
- 服务端会生成一个公钥
server-public-key
发给客户端。 - 客户端在
Client Key Change
时也会生成一个公钥client-public-key
发给服务端。 - 最终,
pre-master
由服务端的server-public-key
+ 客户端的client-public-key
,再根据ECDHE
算法计算而来。
该算法可以保证两边计算出来的结果是一样的。
ECDHE 原理
在了解什么是 ECDHE
之前,首先可先了解下 DH 算法 的原理。
其实很简单,就是利用了模幂运算的特性。
gᵃᵇ mod p = (gᵃ mod p)ᵇ mod p = (gᵇ mod p)ᵃ mod p
对照上面 ECDHE 握手过程图来说。
客户端在 Client Key Change
这一步的公私钥数据如下:
私钥:a
公钥:A = gᵃ mod p
服务端在 Server Key Change
这一步的公私钥数据如下:
私钥:b
公钥:B = gᵇ mod p
客户端根据服务端传来的公钥 B 和自己的私钥 a,计算出秘钥 k1:
k1 = Bᵃ mod p = (gᵇ mod p)ᵃ mod p = gᵃᵇ mod p
服务端根据客户端传来的公钥 A 和自己的私钥 b,计算出秘钥 k2:
k2 = Aᵇ mod p = (gᵃ mod p)ᵇ mod p = gᵃᵇ mod p
那么,由此计算出的 k1 和 k2 是相等的。
那 DHE 又是什么呢?DHE 算法与 DH 原理是相同的,只不过由于 DH 算法一方的公钥是固定的,不具有前向安全性
。因此改进成了 DHE,E
代表 ephemeral
,短暂的,即每次都生成公私钥。
ECDHE 则是在 DHE 的基础上,将整数域里的离散对数替换成了椭圆曲线的离散对数,使其更难以破解,更加安全。
注意:ECDHE 算法参数 public-key 是不需要加密的。因为即使黑客拿到了公钥参数,也很难计算出 pre-master。
两者区别
两种算法的区别主要在于:
- RSA 私钥是固定的,破解后可以得到所有的算法参数。
- ECDHE 是每次重新生成参数,一次一密,更加安全。
因此在 TLS 1.3
中,废除了 RSA
和 DH
算法,使用了更加安全的 ECDHE
。
网友评论