HTTPS就是对HTTP进行了加密,因为要保证数据安全,就需要进行加密,网络中不再直接传输明文了,而是加密之后的密文,加密的方法有很多,但是整体可以分为两大类:对称加密和非对称加密
对称加密
对称加密其实就是通过同一个 "密钥" , 把明文加密成密文, 并且也能把密文解密成明文,引入对称加密之后, 即使数据被截获, 由于黑客不知道密钥是啥, 因此就无法进行解密, 也就不知道请求的 真实内容是啥了
![](https://img-blog.csdnimg.cn/9cd41d8e888341c6aba655eba7f88ac1.png)
但事情没这么简单. 服务器同一时刻其实是给很多客户端提供服务的. 这么多客户端, 每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了, 黑客就也能拿到了). 因此服务器就需要维护每个客户端 和每个密钥之间的关联关系, 这是一件很麻烦的事情
比较理想的做法, 就是能在客户端和服务器建立连接的时候, 由客户端发送对HTTP数据进行加密的对称密钥给服务器
但是如果直接把对称密钥明文传输, 那么黑客也就能获得对称密钥了,所以对称密钥在发送给服务器时也必须是加密传输
非对称加密
非对称加密要用到两个密钥, 一个叫做 "公钥", 一个叫做 "私钥".
公钥和私钥是配对的. 最大的缺点就是运算速度非常慢,比对称加密要慢很多.
通过公钥对明文加密, 变成密文 通过私钥对密文解密, 变成明文,也可以反着用 通过私钥对明文加密, 变成密文 通过公钥对密文解密, 变成明文
使用非对称加密来传输对称密钥的流程
1.首先由服务器生成一组公钥-私钥,服务器自己留下私钥,把公钥发送给客户端
2.客户端收到公钥以后,用收到的公钥加密对称密钥,并把加密后的对称密钥发送给服务器
3.服务器收到加密后的对称密钥后,用保留着的私钥进行解密,获得对称密钥的内容
4.服务器用收到的对称密钥加密HTTP应答数据,并发送给客户端
5.客户端收到应答数据后,用对称密钥进行解密,获得HTTP应答数据,此时客户端就知道服务器已经获得了对称密钥,客户端就用对称密钥加密业务数据发送给服务器
6.此后,客户端和服务器用对称密钥加密数据进行通信即可,因为对称密钥只有客户端和服务器双方有,黑客就算截获到了密文,没有对称密钥也不知道内容
由于对称加密的效率比非对称加密高很多, 因此只是在开始阶段协商对称密钥的时候使用非对称加密, 后续双方都有对称密钥了就不需要非对称加密了
采用非对称加密就能保证数据安全传输了吗❓
答案是远远不够滴,因为黑客又想到了“中间人攻击”的方式来获得对称密钥
![](https://img-blog.csdnimg.cn/70148d0556bc4b3b8083fc8d85f3cc23.png)
现在就让我来详细描述一下黑客是如何进行中间人攻击的
1.首先由服务器生成一组公钥pub1-私钥pri1,服务器自己留下私钥pri1,把公钥pub1发送给客户端
2.黑客先客户端一步截获到了服务器发送给客户端的公钥pub1,黑客自己又生成了一组公钥pub2-私钥pri2,黑客将自己生成的公钥pub2发送给客户端
3.客户端用黑客发送过来的公钥pub2加密对称密钥,并把加密后的对称密钥发送给服务器
4.黑客先服务器一步获取到加密后的对称密钥,由于对称密钥是用黑客发送的公钥pub2加密的,所以黑客可以用私钥pri2进行解密,获取到对称密钥的内容,然后黑客再用服务器发送的公钥pub1加密对称密钥,再把加密后的对称密钥发送给服务器
5.服务器收到对称密钥后,由于黑客是用服务器发送过来的公钥pub1加密的,所以服务器用私钥pri1可以成功解密,获得对称密钥
6.此时,客户端和服务器都不知道对称密钥其实已经被获取了,之后用这个对称密钥发送的业务数据都将被黑客截获,被读取到其中的内容
看完之后是否感叹黑客的手段,但聪明的程序猿还是有办法解决
引入证书
在客户端和服务器刚一建立连接的时候, 服务器给客户端返回一个 证书. 这个证书包含了刚才的公钥, 也包含了网站的身份信息.
这个证书就好比人的身份证, 作为这个网站的身份标识. 搭建一个 HTTPS 网站要在CA机构先申请一个证书. (类似于去公安局办个身份证).
这个证书可以理解成是一个结构化的字符串, 里面包含了以下信息: 证书发布机构 证书有效期 公钥 证书所有者 签名 ......
当客户端获取到这个证书之后, 会对证书进行校验(防止证书是伪造的)
通过证书客户端便能知道当前的公钥是服务器发送的还是黑客发送的,便防止了黑客进行中间人攻击
黑客有没有可能去修改证书中的公钥呢❓
我们上面提到,证书中包含了服务器要发送给客户端的公钥,那么黑客有没有可能去修改证书中的公钥呢,这是有可能的,但是客户端能够发现证书中的公钥被修改
客户端是如何发现证书被修改过的呢❓
证书中有一个属性是数字签名,实际上就是一个加密后的校验和,校验和是通过证书中的内容和算法计算出来的
当黑客修改证书中的公钥发送给客户端,客户端在收到证书后会对证书中的数字签名进行解密,获得校验和,客户端还会再根据证书中的内容计算一次校验和,比较当前计算的校验和与数字签名中的校验和是否相同,要是黑客修改过公钥的话校验和就肯定不相同,客户端就能够发现了
黑客有没有可能公钥和数字签名一起修改呢❓
聪明的小伙伴可能想到了这个问题,我们前面提到,客户端之所以能够发现证书中的公钥被修改过,是因为数字签名解密后得到的校验和与实际计算出来的校验和不同,那黑客把公钥和数字签名都改了,让客户端计算出来的校验和与数字签名解密得到的校验和一样,该怎么办呢
实际上黑客是可以公钥和数字签名一起修改的,但还是会被客户端发现
因为数字签名实际上是通过CA机构私钥加密后的校验和,而CA机构公钥是内置于操作系统中的,所以只要有操作系统的电脑都有CA机构公钥,能够去解密数字签名,包括黑客
所以黑客能够解密数字签名,将证书中的公钥以及数字签名全部修改,但修改以后黑客不能将数字签名再加密回去,因为CA机构的私钥黑客是没有的,要是黑客用自己的私钥对数字签名进行加密的话,客户端用内置的CA机构的公钥就不能解密,客户端就知道了这个证书有问题,也就不会用这个证书中的公钥加密数据了
总结HTTPS的工作过程
![](https://img-blog.csdnimg.cn/a80942a088e8415894df6bf09d3885cf.png)
我们对于HTTPS工作过程的讨论到这里就结束了,但其实黑客还是会有办法去获取到对称密钥,毕竟道高一尺魔高一丈嘛,但聪明的程序猿还是会有办法的,这里就不过多讨论了