美文网首页
TLS 握手过程

TLS 握手过程

作者: 微微笑的蜗牛 | 来源:发表于2020-11-03 14:33 被阅读0次

    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 中,废除了 RSADH 算法,使用了更加安全的 ECDHE

    相关文章

      网友评论

          本文标题:TLS 握手过程

          本文链接:https://www.haomeiwen.com/subject/lqfbvktx.html