HTTPS原理解析

1. 明文传输

我们知道HTTP传输的都是明文数据,黑客很容易截获到传输的数据,安全性很差,相当于在互联网上裸奔。对于敏感数据需要用HTTPS传输,那么HTTPS怎么保证数据安全的呢?这要从对称加密和非对称加密讲起。

2. 对称加密

所谓的对称加密,就是对数据的加密和解密都是用的同一个密钥

这里传输的数据不是明文了,而是用密码加密后的密文,黑客截获到了密文也不知道原始数据是什么,但是有以下问题:

  1. 客户端和服务端都需要存储密钥,服务端可能有大量的客户端连接,如果每个客户端与服务端用的密钥都一样的话,所有客户端都用一样的密钥,等于没有加密。如果服务端和客户端之间的密钥是各不相同的,那么服务端需要维护大量的密钥,存储成本很大
  2. 服务端和客户端最初开始协商密钥的过程没办法保证不被黑客截获,后续数据传输仍然不安全

针对以上问题,需要引入非对称加密

3. 非对称加密

与对称加密客户端和服务端只有一个密钥不同的是,非对称加密存在公钥和私钥两种密钥,特点是公钥加密过的数据私钥可以解密,私钥加密过的数据公钥可以解密。

客户端与服务端数据交互过程如下:

  1. 首先公钥和私钥是存储在服务端的,客户端要请求服务端拿到公钥
  2. 客户端用拿到的公钥加密数据并发送给服务端

我们来看一下这个过程有什么问题,首先客户端向服务端发送数据的过程肯定是安全的,因为只有服务端有私钥可以解密数据,但是服务端怎么向客户端安全地发送数据呢?

  1. 服务端不能用公钥加密数据,因为客户端没有私钥解不开
  2. 服务端用私钥加密数据,客户端可以解密,但是同样的黑客也能用从服务端那里获取的公钥解密数据,所以还是不安全的

所以需要对称加密和非对称加密结合起来解决这个问题

4. 对称加密+非对称加密

客户端与服务端数据交互过程如下:

  1. 首先公钥和私钥是存储在服务端的,客户端还是要请求服务端拿到公钥
  2. 客户端用拿到的公钥之后,用公钥加密一个对称加密的密钥发送给服务端
  3. 服务端用私钥解开得到对称加密的密钥,后续数据的传输都是用对称加密的密钥进行

简单来说,就是用非对称加密协商对称加密的密钥,对称加密传输实际交互的数据,这样安全和性能都得到了保证。

但是,这个方案存在中间人问题

我们来看下客户端与服务端的数据交互过程:

  1. 首先客户端还是要请求服务端的公钥,但是这时被中间人拦截了,中间人也有自己的公钥和私钥,我们用公钥1和私钥1与服务端的公钥和私钥进行区分,中间人把自己的公钥1返回给客户端了,也就是上图中的1和2
  2. 然后中间人假装自己是客户端去服务端请求公钥,服务端把自己的公钥返回给了中间人,也就是上图中的3和4
  3. 接下来客户端把自己的用于对称加密的密钥用中间人给的公钥1加密传输,中间人拦截到了之后用自己的私钥1解密得到客户端的密钥。并且中间人也有自己的用于对称加密的密钥1用于和服务端交互,中间人用服务端的公钥加密密钥1发送给服务端,服务端用私钥解密得到中间人的密钥1,也就是上图中的5和6
  4. 然后就开始数据传输的过程了,客户端用密钥加密数据发送出去(上图中的7),被中间人拦截并用密钥解密得到客户端想要发送给服务端的数据(上图中的8),这时就可以对数据进行篡改了,然后把篡改后的数据用自己的密钥1加密并发送到服务端,服务端收到了之后用密钥1解密得到数据(上图中的9),然后服务端用私钥加密服务端想要发送给客户端的数据(上图中的10),发送后被中间人拦截,中间人用服务端的公钥解密得到数据(上图中的11),中间人接着篡改数据,然后用密钥加密发送给客户端(上图中的12)

可以发现客户端和服务端的整个交互过程完全被中间人拦截了,那么问题的根源是什么呢?其实就是客户端没办法判断返回的公钥是服务端的还是中间人的,这其实就是密码学中的身份验证问题,中间人在第一步就假装是服务端李代桃僵了,解决这个问题的办法就是引入ca

5. 对称加密+非对称加密+ca

客户端与服务端数据交互过程如下:

  1. 客户端首先去请求服务端的licence,也就是证书,这个licence是什么呢,就是服务端的公钥发送给ca机构,ca机构用自己的私钥对其加密(一般会收费的),加密后的东西就叫licence
  2. 客户端拿到licence后,用ca机构对应的公钥解密licence就可以得到服务端的公钥

这里可能有小伙伴会问,客户端的ca机构的公钥从哪里来的呢?这个公钥协商的过程又是怎么保证安全的呢?其实这就是个鸡生蛋蛋生鸡的问题,实际上最后也是操作系统托底,操作系统内置了大量ca机构的公钥。

这里还有个问题,ca机构不可能只给服务端制作证书,它也可能会给中间人发放证书,这样中间人就有机会对你的证书进行调包,客户端在这种情况下是无法分辨接收的证书是服务端的还是中间人的,因为不论中间人还是服务端的证书,都能用ca机构的公钥解密,解决这个问题需要引入数字签名

6. 参考资料

https://www.cnblogs.com/zhangshitong/p/6478721.html
https://wetest.qq.com/lab/view/110.html
https://www.zhihu.com/question/33645891
https://www.bilibili.com/video/BV1w4411m7GL?from=search&seid=2868273180665832113

posted @ 2020-06-11 19:07  sakura1027  阅读(241)  评论(0编辑  收藏  举报