一、什么是HTTPS,什么是加密
HTTPS也是一个应用层协议,实在HTTP协议的基础上引入了一个加密层。HTTP协议内容都是按照文本的方式明文传输的,就导致在传输过程中出现一些被篡改的情况。
“运营商劫持”就是由于http没有加密而导致的情况。
运营商劫持:比如我在网页上想要下载原神,如何我点击了下载原神这个按钮,但是,发现弹出的下载框里并不是原神的下载包,而是某不知名软件的下载包让我们下载,这种情况就叫做运营商劫持。
通过网络传输的任何数据报都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络黑色被就可以解析出你传输的数据内容,进行篡改。
点击的下载按钮就是给服务器发送了一个HTTP请求,获取到的HTTP行营其实就包含了该不知名软件软件的下载链接。运营商劫持以后,就发现这个请求是要下载原神,然后就会,自动把交给用户的响应给篡改成了某个不知名软件的下载地址了。
只要网络上的数据是明文传输的,都存在被劫持而篡改的风险。
对网站进行加密就可以改善这个问题,HTTPS就是为此而生的。
明文:实际要传达的信息。
密文:转换后得到的信息。
加密:就是把铭文转换还曾密文的过程。
密钥:在加密和解密的过程中,需要的钥匙。
密码学的奠基人(祖师爷)—— 图灵。
二、加密解密的宏观流程
主要有两种加密:对称加密和非对称加密
关于对称加密:
对称加密:只有一个密钥key
明文和key的组合 → 密文
密文和key的组合 → 明文
关于非对称加密:
非对称加密:需要两个密钥,一个叫做公钥(pub),另一个叫做私钥(pri)
明文和pub的组合 → 密文
密文和pri的组合 → 明文
明文和pri的组合 → 密文
密文和pub的组合 → 明文
相比对称加密,非对称加密的成本更高。
三、HTTPS的基本过程(加密解密的过程)
加密:对HTTP的各种header和body进行加密
1.对称密钥key
当传输时,客户端生成了自己的密钥后,就会将key通过网络发送给服务器。但是有一个问题,客户端的数量很多,如果使得key相同,就会使得key传播出去,使信息容易泄露,被黑客截获。
但是如果对称密钥都不相同,就会使得key需要很多个,每一个客户端对应的对称密钥都不相同,这样既麻烦又困难。为了避免这种请情况,于是引入了非对称密钥。
2.非对称密钥pub和pri
公钥:pub
私钥:pri
对称密钥:key
其中使用pub加锁,使用pri解锁。
下面的方式使用非对称密钥对对称密钥进行加密,
图解 :
首先明白一个事实:非对密钥中的pub对对称密钥进行加密后,只有pri才能解密。
对于客户端和服务器,使用非对称密钥交互过程:
1.客户端对服务器询问pub。
2.服务器收到了来自客户端询问pub这个信息,于是返回pub,此时,该pub是每个客户端都可见的,而pub对应的pri是只有服务器自己才知道的。
3.客户端收到pub以后,就会生成一个对称密钥key,该key会对客户端发送的数据进行加密,而pub会对这个key进行加密,也就是双重加密;加密成功以后,客户端会发送这个密文给服务器。
4.服务器拿到密文以后,使用pri对pub进行解锁,解锁成功以后,就能拿到对称密钥key,并且返回一个已经拿到key的信息
5.客户端收到了服务器拿到key的信息以后,也就相当于对方已经对上暗号了,既然已经认识了对方,后续的数据就可以直接使用对称密钥key进行数据传输了。
这种方法虽然比直接使用对称密钥传输数据更加安全,但是还是存在隐患,会带来问题:中间人攻击。
图注:
pub:服务器给客户端的pub
pri:pub对应的pri,捏在服务器手中
pub2和pri2:中间人(黑客)生成的一堆非对称密钥。
key:使用客户端发来的pub生成的对称密钥
key2:使用黑客发来的pub2生成的对称密钥
过程:
1.客户端向服务器询问pub
2.黑客将“客户端询问pub”这条信息转发给服务器,服务器返回了pub,此时,黑客拦截了这条“返回pub”的信息,并且将自己生成的pub2返回给客户端,偷梁换柱。
3.客户端拿到pub2以后,使用了pub2生成了对称密钥key2,使用这个key2对客户端自己发送的数据进行加锁,使用pub2对key2进行加锁;加锁以后,传输这条密文给客户端。
4.黑客收到了这条信息,使用自己pri2对pub2进行了解锁,解锁以后就拿到了对称密钥key2,然后就拿到了客户端的数据;于此同时,使用客户端发来的pub生成一个对称密钥key进行加锁,并且使用该pub对key进行加锁,传输给服务器。
5.服务器收到了黑客发来的消息(以为是客户端发来的),对pub解锁拿到了key,并且返回一个已拿到key的信息给客户端,表示我们以后一起使用key传输数据即可。
6.从此以后,两人传输中多了一个第三者(中间人),使他们信息传输割裂,本来是客户端与服务器的交互,变成了,客户端与黑客的交互,黑客与服务器的交互了。
3.证书
为了解决上面“中间人攻击”的问题,从中引入了“证书”。
证书,不是一个纸质的证书,而是一串数据(就是一串字符串,类似于一个对象,然后里面有很多属性)
证书由机构发布,
现在有一个服务器,想要使用这个服务器,就要去该机构里面申请证书,申请时提交一些资料(可能还需要缴费),机构进行审核,审核通过就会给你颁发证书,服务器中的公钥就包含在证书里面。
证书可以理解成一个结构化的字符串,里面包含证书发布机构,服务器的域名,证书有效期,公钥,证书所有者,被加密的签名等等很多信息。
其中被加密的签名是很重要的。签名,就是校验和(两个数据,如果相同,那么校验和就一定相同),这个校验和,是使用证书中的其他各个属性,综合在一起运算出的一个数字,该签名被证书的颁布机构还用了pri加密了。
有一个肯定的概念:如果证书里面数据相同,按照相同的算法计算得到的签名与加密的签名一定相同,反之,如果签名不同,得到的数据也就不同。
有了证书以后,就能有效的防止中间人攻击:
图注:
pri1:对证书中的签名加密的私钥,其他人都不能看见
pub1:权威机构给服务器发布证书以后,每台客户端操作系统内都会内置一个pub,这个pub可以对签名进行解锁
pub2:证书中的公钥2,用这个可以生成对称密钥key
pri2:pub2对应的私钥2,服务器使用其获取对称密钥
上图只画了一部分, 主要步骤如下:
第一步:客户端向服务器询问证书,然后服务器返回证书;客户端拿到证书以后,使用系统内置的pub1对签名进行解密,的带课初始签名(sum1)
第二步:客户端根据证书中的属性计算签名,得到sum2
第三步:比较sum1和sum2,如果两者相同,证明证书中的数据都是没有被篡改的原始数据,如果签名不同,说明证书中的信息已经被篡改了,客户端的浏览器会直接提醒报错。
第四步:客户端顺利对签名解密以后,就会拿到pub2,生成对称密钥,并且使用pub2生成对称密钥传输给服务器,服务器接收到以后,对客户端表示确认已经收到了对称密钥key。
第五步:双方可以使用对称密钥传输信息了
关于黑客为什么不能对证书进行篡改:
一是,黑客篡改了证书签名,但是我们可以直接校验(就是根据证书特性计算得到的校验值和签名比较,对应上面的第二步)到签名已经被篡改了
二是,如果黑客根据算法连着属性一起篡改,但是,黑客使用pub1解锁以后,并不能加锁,因为pri1是只有服务器才知道的,此时客户端可以校验到,证书签名被解锁了,于是就会返回为错误。