目录
HTTPS是一个应用层的协议,是在HTTP协议的基础上引入了一个加密层.
HTTP协议内容都是按照文本的方式明文传输,这就导致在传输的过程中出现一些被篡改的情况.
运营商劫持事件
未被劫持的效果,点击下载按钮,就会弹出天天动听的下载链接.
天天动听被劫持的效果,点击下载按钮,就会弹出QQ浏览器的下载链接.
由于我们通过网络传输的任何数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析出你传输的数据内容,并进行篡改.
点击下载按钮,起始就是在给服务器发送了一个HTTP请求,获取到的HTTP响应就包含了该App的下载链接,运营商劫持之后,就发现这个请求是要下载天天动听,那么就会自动的把交给用户的响应给篡改成QQ浏览器的下载地址了.
不止运营商可以劫持,其他的黑客也可以利用类似的手段来进行劫持,来窃取用户的隐私信息或者篡改内容.
所以,在互联网上,明文传输时比较危险的事情.
HTTPS就是在HTTP的基础上进行了加密,进一步的来保证用户的信息安全.
HTTPS=HTTP+加密层(SSL),SSL是用来加密的协议,也叫做TLS.
进行安全传输,核心就是加密.
加密就是把明文(要传输的信息)进行一系列的变换,生成密文.
解密就是把密文在进行一系列变换,还原成明文.
在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据成为密钥.
加密其中一种最简单有效的办法,叫做对称加密.
加密过程:明文+密钥=>密文;
解密过程:密文+密钥=>明文.
同一个密钥,既可以用来加密,也可以用来解密,这就是对称密钥.
对称加密安全性的前提是,密钥不能被黑客知道.
由于黑客不知道密钥是什么,即使黑客截获了加密的数据,也不知道数据是什么意思.
但事情并没有这么简单,服务器同一时刻是要给很多客户端提供服务的,这么多客户端,每个客户端的密钥必须是不同的(如果是相同的,黑客作为一个客户端就很容易把密钥获得),因此服务器就需要维护每个客户端和每个密钥之间的关联关系,这是个很麻烦的事情.
更理想的做法是在客户端和服务器建立连接的时候,双方协定确定这次的密钥是什么 .
但是如果直接把密钥进行明文传输,那么黑客也就能获得密钥了,此时后续的加密操作就形同虚设了.
因此密钥的传输必须加密传输.
但是此时如果还对密钥的传输采用对称加密的方式,就仍需要双方协定一个密钥的密钥,显然这是行不通的.
那么此时就需要引入非对称加密了.
非对称加密要用到两个密钥,一个叫做公钥,一个叫做私钥.
公钥和私钥是配对的,最大的缺点就是运算速度非常慢,比对称加密要慢很多.
通过公钥对明文加密,变成密文;通过私钥对密文解密,变成明文.也可以反着用.
客户端在本地生成对称密钥,通过公钥加密,发给服务器.
由于中间的网络设备没有私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥.
服务器通过私钥解密,还原出客户端发送的对称密钥,并且使用这个对称密钥加密给客户端返回的响应数据.
后续客户端和服务器的通信都只用对称加密即可.由于该密钥只有客户端和服务器两个主机知道,其他设备不知道密钥即使截获数据也没有意义.
注意:由于对称加密的效率比非对称加密高很多,因此只有在开始阶段协商密钥的时候采用非对称加密,后续的传输仍然使用对称加密.
有了上述过程之后,那么客户端如何获取到公钥呢?
如果采用简单询问的方式,就会出现中间人攻击的情况.
黑客在中间设备自己也生成一对非对称密钥,称为pub2和pri2.同时黑客自己存下pub1.黑客拿着自己的pri2进行解密,就拿到了对称密钥key,然后黑客继续使用服务器的pub1公钥,对key重新加密,继续传送给服务器.
这就导致对称密钥泄露了,此时黑客就可以拿着这个对称密钥对后续的数据进行篡改了.
解决这个中间人攻击的关键,在于让客户端能够辨别当前的公钥响应是服务器真实的公钥.
引入证书就可以解决这个问题.
在客户端和服务器刚建立连接的时候,服务器就不单单给客户端返回公钥了,而是返回一个证书.
在这个证书里就包含了刚才的公钥,也包含了网站的身份信息.
这个证书就好比人的身份证,作为这个网站的身份标识,搭建一个HTTPS网站要在CA机构先申请一个证书(类似去公安局办身份证).
这个证书可以理解成是一个结构化的字符串,里面包含了证书发布机构,证书有效期,公钥,证书所有者,签名等信息.
当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的).
如何校验?
证书可以在浏览器里查看
黑客能够篡改证书?
认证机构也有一组公钥私钥,私钥用来加密hash值得到签名了,公钥是客户端拥有的使用公钥解密签名获取hash值.
如果黑客替换了公钥,此时客户端计算的hash2和签名解密出来的hash1就对不上了,客户端就知道无效了.
另外黑客不知道认证机构的私钥,即使黑客自己计算好了新的篡改后的hash值,也无法加密生成签名!