目录
前言
HTTPS的报文格式和HTTP并没有太大的区别,这里不再介绍,本篇博客主要介绍HTTPS的加密的过程。
一、一个案例
什么是运营商劫持:运营商劫持(ISP hijacking)是指互联网服务提供商(ISP)在互联网通信过程中篡改或拦截用户的网络流量,以达到某种目的的行为。这种劫持通常发生在运营商的网络基础设施中,可以影响用户的网络体验、访问特定网站或服务,并可能泄露用户的敏感信息。
以下是一个例子来说明运营商劫持的情况:
我们现在在很多的搜索引擎中搜索东西时,都会有很多广告,这些广告都是搜索引擎的公司的盈利手段,假设以搜狗为例,假设搜狗的广告是以点击计费的,只要有人点击广告,搜狗就可以有收益,这时候就涉及到了到底有多少人点击了广告,搜狗这边是很好统计的,当然在广告主那边也是可以统计的。最后在统计点击次数的时候只要搜狗方面的次数和广告主的次数对的上,广告主自然会乐意付钱,否则就不会乐意付钱了。上篇博客我们介绍的HTTP报文格式和属性,其中有一个Referer属性,这个属性可以知道当前网页是从哪里跳转过来的。对于广告主这边,只要抓到包,看看包里面的Referer属性就知道该网页是从哪里跳转过来的了。就可以据此来统计点击次数了。当然这些http数据包都是通过网络来转发的,所以转发过程中就可以遭受到劫持,假如这时候被运营商劫持了,并且修改了其中Referer属性的值,广告主这边就无法正确统计了,很明显,运营商这样做的原因就是为了盈利。这个在早几年的时候是真实存在的。而且是普遍存在的现象。
二、什么是HTTPS
HTTPS 也是一个应用层协议. 是在 HTTP 协议的基础上引入了一个加密层. HTTP 协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况。
为什么需要HTTPS:由于http数据报很有可能被运营商或者黑客劫持,因此就需要对http数据报进行加密传输,才可以安全传输,即使数据报被劫持了,劫持者也看不懂,篡改的话我们浏览器这边也会有提示。
三、HTTPS加密过程
什么是加密
概念:加密就是把明文 (要传输的信息)进行一系列变换, 生成密文。解密就是把密文再进行一系列变换, 还原成明文 . 在这个加密和解密的过程中, 往往需要一个或者多个中间的数据, 辅助进行这个过程, 这样的数据称为密钥。
对称加密
对称加密其实就是通过同一个 "密钥" , 把明文加密成密文, 并且也能把密文解密成明文。
非对称加密
非对称加密和对称加密的区别就在于不使用同一个密钥key加密和解密,非对称加密会有一组密钥,公钥pub和私钥pri,一般是使用公钥加密,使用私钥解密。
首先我们先来使用对称加密的效果: 以上使用对称加密看似安全了,但是还是少考虑了两个问题,就是服务器是否知道密钥key?密钥key从哪来?如果不知道那就无法解析密文了。接下来就来解决这两个问题:这里的密钥key应该每一个客户端都是要不一样的,如果一样的话,只要黑客给服务器发送个请求,也就可以知道密钥key了,因此这里的密钥就是由客户端自己随机生成一个密钥,然后发给服务器,服务器得到之后,就可以解析密文了。
优化之后如下:
优化之后:优化之后显然还是非常不安全,因为这样子传输密钥的话,黑客截获到了传输的密钥的数据报,一下子就得到密钥了,之后的加密传输也就形同虚设了。因此我们就需要对密钥的传输进行加密;
优化思路:我们是否可以再让客户端生成一个对称密钥key2来加密key呢?这样子key看上去是被加密了,但是黑客也可能再截获了你传输key2的数据报,因此据此来破解key,因此这里再使用对称加密的方式显然已经行不通了。所以这时候我们就可以考虑非对称加密了。我们可以让服务器生成一对密钥,当客户端发起请求时,就把公钥给客户端,客户端使用公钥对key进行加密,加密完返回给服务器,服务器再通过私钥进行解密,就可以拿到key了。这个过程中,黑客可以拿到服务器的公钥和经过公钥加密的key,但是黑客没有私钥,所以就没办法解开key了。因此这时候安全程度又提升了。
经过上述的优化之后,看似已经很安全了,但是黑客实在太聪明了,黑客拿到了服务器返回的公钥pub之后,将这个公钥劫持下来了,劫持之后,自己生成一对密钥pub2和pri2,(也就是黑客把自己伪装成服务器)再将自己的公钥pub2返回给客户端,客户端并不知道这个公钥是假的,因此就使用pub2加密了key,黑客再次截获了客户端发出的数据报,使用自己的私钥pri2得到key,再使用得到的pub对key进行加密,返回给服务器,服务器得到之后就会使用key对数据进行加密传输了。但是这时候黑客也知道了key,因此黑客也就很容易的能够破解加密的内容了。上述这个过程称为“中间人攻击”。具体过程如下图所示:
上述的中间人攻击,其实本质上就是因为,客户端方面无法知道服务器传过来的公钥的真假性。因此也就给了黑客可乘之机。为了解决上述的问题,HTTPS中又引入了一个证书的概念。证书就是为了防止黑客篡改数据报当中内容的。
引入证书:
证书是什么?这个证书就好比人的身份证, 作为这个网站的身份标识. 搭建一个 HTTPS 网站要在CA机构先申请一 个证书. (类似于去公安局办个身份证).
证书包含什么内容:这个证书可以理解成是一个结构化的字符串, 里面包含了以下信息: 证书发布机构,证书有效期,公钥,证书所有者,加密的签名等等;
证书在哪里:证书是电脑出厂之后就自带的,存放在系统中的。
查看证书:我们可以在浏览器中点开右上方的三点,点开设置,搜索证书就可以看到系统上的证书了。
引入证书后的传输流程:
基于引入证书后的黑客为什么就无法篡改数据的问题:首先我们需要明确证书的公钥是直接在嵌在操作系统上的。当服务器返回证书之后,客户端就会根据系统上的公钥去解开证书中带有加密的签名,使用证书的公钥解密得到一个值这里称为sum1,接着可以基于证书中的各个属性按照相同的就算签名的算法计算一遍得到sum2,此时就可以比较sum1和sum2的值,相同的话就是没被篡改过,否则就是被篡改过的了。
黑客能不能篡改其中的加密签名,再基于同样的签名算法重新计算签名的值,进而达到篡改数据的目的:答案肯定是不行,这里首先需要明确的是,这个签名是加密的,是使用证书机构的私钥进行加密的;当黑客使用证书的公钥解开加密的签名后,接着又对其中的各个数据进行篡改,最后在基于篡改后的数据使用一样的签名算法进行计算出签名,到这一步为止,都是没有任何问题的,但是这时候虽然新的签名已经被计算出来了,但是这个签名已经是解密过的了。黑客需要对其进行再次加密,但是黑客手中有没有证书机构用于加密的私钥。因此这时候再传到客户端时,浏览器就会提示该网页存在风险等字样了。
HTTPS为什么不直接一直使用非对称加密而要是非要传一个对称密钥的key呢?这是由于对称加密的效率比非对称加密高很多, 因此只是在开始阶段协商密钥的时候使用非对称加密, 后续的传输仍然使用对称加密,保证传输的效率。
上述的对称加密+非对称加密+证书这一套的加密流程并不止于HTTP中,这其实是一个协议,称为SSL协议,有兴趣可以自己在网上了解一下。