什么是HTTPS
HTTPS是基于HTTP套了一个加密层(SSL),HTTP是明文传输,并不安全.
不知道各位在网上下载中有没有遇到这种情况,本来我们要下载一个音乐软件,但是弹出的下载链接下载的却是某个浏览器.很让人头麻.还有某数字安全卫士,也是遍布了我们网络.稍有不慎,全家桶就给你安排上
https>https://i-blog.csdnimg.cn/direct/fbf68a498b9c4f77aa1be0c85801af52.png" width="259" />
https>https://i-blog.csdnimg.cn/direct/ea643f9f60e7404ea89f0a57725e8103.png" width="392" />
上面这种现象就是运营商为了点小猫ni搞得鬼,我们就称为"运营商劫持"
很明显,这其中的玄机我们不得而知.那我们要如何杜绝这种现象,就是加密.
1.加密
解决上面最核心的解决问题就是加密.
下面我们介绍下几个密码学中的概念:
明文:真正要传输的数据
密文:针对明文进行了加密,得到的结果往往不直观
由明文变成密文==>就是加密
由密文变成明文==>就是解密
这一过程就像发电报,如果我们收到一个电报,这里电报就是属于密文,我们需要用一个密码本来进行解密.此时这个密码本就是加密解密的关键道具,我们叫做密钥
对称加密:
加密和解密使用同一个密钥,就像发电报一样,我用密码本1来进行加密发电报,收方就应该也用密码本1来进行解密.
非对称加密:
加密和解密需要两个密钥
这两个密钥是成对的:k1,k2是成对的
此时k1用来加密,k2就用来解密
也可以用k2加密,k1解密.
而两个密钥,公开出去的那个就是公钥,自己保存的就是私钥
2.HTTPS的工作流程
只要对HTTPS格式的数据进行解密,就可以拿到HTTP格式的数据
上述的运营商劫持本质上都是明文传输惹的祸.于是我们就通过加密对数据进行保护.
这里主要是针对header和body进行加密
(a).引入对称加密
通过对称加密的方式对传输的数据进行加密的操作.
1.对称加密的时候,客户端和服务器使用的是同一个密钥
2不同的客户端要使用不同的密钥
这里有一个问题,密钥是要传输给对方的,如果在传输之间让黑客劫持并且拿到了密钥.那我们加密就是一个笑话了
https>https://i-blog.csdnimg.cn/direct/b11c14cf142e46738f2beb3786c56ab6.png" width="530" />
那我们该如何处理呢?
这里我们针对密钥也进行加密,但是如果使用对称加密的话只是俄罗斯套娃,没有什么效果
于是我们就会使用非对称加密.非对称加密会生成两个密钥,一个密钥告诉所有客户端,就是公钥,自己保存的就是私钥.公钥也不怕黑客知道,因为私钥只有服务器自己持有,只有公钥和私钥一起才可以进行解密.
(b)引入非对称加密
使用非对称加密 ,主要是针对对称密钥加密,确保对称密钥的安全性.
如果使用非对称密钥对数据进行加密,少来少去的还是可以胜任,但是我们传输的数据一般都是很多的,这样对于非对称加密的开销就变得非常大.所以不可取
https>https://i-blog.csdnimg.cn/direct/dc4548c67b2d41ffac2445c845ae0f1d.png" width="1551" />
但是上述的传输数据的方式还是存在一个重大漏洞
此时黑客会用自己聪明的大脑也申请一个公钥和私钥.
https>https://i-blog.csdnimg.cn/direct/3ef9720cdb34441d9e0f52c2e75ad508.png" width="1390" />
这就是中间人攻击,在传输密钥期间,黑客用自己的公钥进行了偷梁换柱,将服务器返回的公钥换成自己的公钥返回给客户端,此时客户端不知道发生了什么,就将对称密钥针对黑客的公钥发送出去,此时黑客通过自己的公钥和私钥进行解密 ,得到密钥后.为了不引起服务器的怀疑,就用服务器的公钥对密钥加密发送给服务器.
上面黑客的操作着实棋高一招,但是我们的程序员道高一尺魔高一丈.
最主要的问题就是客户端拿到公钥之后如何验证公钥是不是真的,问题就迎刃而解了
解决办法:服务器提供"证书"
证书是一个结构化数据,包含了很多属性,最终以字符串的形式提供.
证书中会包括:服务器域名,公钥,证书有效期
搭建服务器的时候,我们要从公证机构申请证书
https>https://i-blog.csdnimg.cn/direct/a1972a9313e64434aca65507481cd8d3.png" width="473" />
证书验证的过程:
证书中可能会包含这些信息
https>https://i-blog.csdnimg.cn/direct/64e4864417aa48d3baa43de237b74d9c.png" width="188" />
其中最重要的就是证书的签名.这个签名并不是真正的签名,而是根据算法将证书的数据算出他的校验和,然后公证机构使用自己的私钥(不是服务器的私钥),针对校验和进行加密,此时就得到了签名.
客户端拿到证书之后主要做两件事:
1.按照同样的校验和算法将证书中的信息进行计算得到校验和 val1;
2.通过公证机构在系统中内置的公钥来对证书进行解密,得到校验和val2;
此时就对比看两个校验和是不是一致的
一致就是没被修改过的
不一致就是被修改过的,如果黑客替换成了自己的公钥,此时客户端通过计算就会发现数据错误.此时客户端就能发现错误.
这时候浏览器就会弹出一个告警界面.告诉用户你访问的网站有风险.当然我们在访问一些奇怪的网站的时候可能会有这种情况