HTTPS 的加密机制,作为网络通信的基础知识,之前东看看,西看看,一直没有研究透彻,最近在知乎上看到了一位小哥的文章,通俗易懂,以问题的形式逐步展开,不断抛出问题,解决问题,原文见引用1,笔者只记录了其中比较重要的知识点,详情可见原文。
本篇文章主要介绍为啥 HTTPS 会比 HTTP 安全,二者之间的区别,以及HTTPS背后的加密原理是什么?
动动发财小手,点赞 + 收藏不迷路。文章较长,建议没事多看几遍,加深理解。
HTTPS是在HTTP上建立SSL加密层,并对传输数据进行加密,是HTTP协议的安全版。
HTTPS主要作用是:
1.对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
2.对网站服务器进行真实身份认证。
在HTTP协议中有可能存在信息窃取或身份伪装等安全问题,
使用HTTPS通信机制可以有效地防止这些问题。
http存在的问题
先简单介绍一下两种加密算法:对称加密、非对称加密
对称加密:加密和解密使用的是同一个秘钥。
非对称加密:与对称加密不同,它有两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
注意:对称加密加密速度快,非对称加密速度慢,后面会用到这个知识点。
首先想到的是对称加密的方案,如果浏览器和服务器持有同一个秘钥,并且秘钥没有泄露,那么浏览器和服务器之间的通信就是安全的。但这是理想情况,通常秘钥需要在网络中传输,才可以让双方都知晓。秘钥采用明文传输,如果被别人拦截到,那么他就可以用这个秘钥解开双方传输的内容了。
鉴于非对称加密的机制,我们可能会有这种思路:服务器先把公钥以明文方式传输给浏览器,之后浏览器向服务器传数据前都先用这个公钥加密好再传,这条数据的安全似乎可以保障了!因为只有服务器有相应的私钥能解开公钥加密的数据。
然而反过来由服务器到浏览器的这条路怎么保障安全?如果服务器用它的私钥加密数据传给浏览器,那么浏览器用公钥可以解密它,而这个公钥是一开始通过明文传输给浏览器的,若这个公钥被中间人劫持到了,那他也能用该公钥解密服务器传来的信息了。所以目前似乎只能保证由浏览器向服务器传输数据的安全性(其实仍有漏洞,下文会说),那由单个方向传输是安全的这点你能想到什么解决方案吗?
我们已经理解通过一组公钥私钥,可以保证单个方向传输的安全性,那用两组公钥私钥,是否就能保证双向传输都安全了?请看下面的过程:
的确可以!抛开这里面仍有的漏洞不谈(下文会讲),HTTPS的加密却没使用这种方案,为什么?很重要的原因是非对称加密算法非常耗时,而对称加密快很多。那我们能不能运用非对称加密的特性解决前面提到的对称加密公钥容易别拦截的问题呢?
既然非对称加密耗时,那非对称加密+对称加密结合可以吗?而且得尽量减少非对称加密的次数。
当然是可以的,且非对称加密、解密各只需用一次即可。
请看一下这个过程:
完美!HTTPS基本就是采用了这种方案。完美?还是有漏洞的。
假如在网站服务器和浏览器之间进行数据传输时,有一个中间人劫持到了数据,看似中间人在拿到公钥A没有什么作用,因为他没有私钥A’,无法解密拿到流浪器的对称加密秘钥X,其实中间人在没有拿到A’的情况下,就可以与网站服务器进行通信。中间人的骚操作如下:
这样在双方都不会发现异常的情况下,中间人通过一套“狸猫换太子”的操作,掉包了服务器传来的公钥,进而得到了密钥X。根本原因是浏览器无法确认收到的公钥是不是网站自己的,因为公钥本身是明文传输的。
中间人攻击的根本问题,在于浏览器无法确保拿到的公钥就是网站的。
那么 HTTPS 是如何来确保浏览器拿到的公钥一定就是网站的呢?答案就是证书颁发机构,假如从机构获取的信息都是可信,能够证明公钥就是对应网站的公钥,那么通信就是安全的。
证书颁发机构就是 CA(Certificate Authority)机构,网站在使用 HTTPS 前,需要向 CA 机构申领一份数字证书,数字证书里含有证书持有者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明“该公钥对应该网站”。而这里又有一个显而易见的问题,“证书本身的传输过程中,如何防止被篡改”?即如何证明证书本身的真实性?身份证运用了一些防伪技术,而数字证书怎么防伪呢?
数字签名制作过程
明文和数字签名共同组成了数字证书,这样一份数字证书就可以颁发给网站了。
浏览器验证过程
最显然的是性能问题,前面我们已经说了非对称加密效率较差,证书信息一般较长,加密比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加解密就快很多。
当然也有安全上的原因,这部分内容相对深一些,感兴趣的可以看这篇解答:
crypto.stackexchange.com/a/12780
引用:
1.https://zhuanlan.zhihu.com/p/43789231
2.https://blog.csdn.net/qianyu6200430/article/details/101443883
3.https://zhuanlan.zhihu.com/p/100657391