在上一篇博客中我们讲到了http协议http://t.csdnimg.cn/OsvCh,没看过之前建议先瞅瞅。
https本质就是对http协议进行了一层加密。为什么要进行加密呢,也参考上面一篇文章,涉及到运营商劫持。
因为http是明文传输,所以要对http进行修改和截取是很容易的事,但是要是对请求进行加密的话,即使你拿到我请求了,也不知道这个请求是什么含义。
Https协议
在学习和了解https协议之前,我们先对加密和解密有一个初步的认识,
- 明文 + 秘钥 --> 密文 加密
- 密文 + 秘钥 --> 明文 解密
具体的过程一般是很复杂的数学和算法换算,看开发者如何定义的。
同时,有的场景 加密和解密是使用的同一个密钥 这个加密称为对称加密
加密和解密使用不同秘钥 这个加密称为非对称加密
非对称加密 一般是生成一对秘钥 “ 公钥 ” “ 私玥 ” 他们之间有一定的关系的,既可以使用公钥加密,私钥解密,也可以使用私钥解密公钥加密。
http协议加密过程
1.对称秘钥
在http协议中,最简单的一个方法就是引入对称秘钥,加密传输过程中的header和body。
这样在传输过程中,黑客要是对数据进行截获,除非黑客有秘钥,否则黑客无法对秘钥进行解密。
但这样会存在一个问题,就是秘钥不能只有一个,每一个客户端都要生成一个相同的秘钥,因为秘钥一旦相同,黑客构造一个客户端就可以轻松拿到密钥了。
如果客户端生成了秘钥,就需要把秘钥传给服务器,因为服务器也不知道秘钥是啥,但是这样做也会存在一个问题,要是这个秘钥被黑客拿到呢了
当客户端传送数据的时候,秘钥被黑客截获了,黑客知道了秘钥是888888之后就可以伪造客户端了,这样数据也会很容易的被破解了。 反之,服务器生成秘钥,也会造成上述问题。
所以我们需要想办法,把秘钥安全的传送到对端,所以我们需要对秘钥也进行加密,但是不能使用对称加密了,因为还是会发送上述的情况。 所以这里我们使用非对称加密来对秘钥进行一个加密。
服务器生成一对公钥和私钥,私钥服务器留着自己用,公钥就发送给客户端。
此时客户端就可以使用公钥对888888进行加密,此时在传输888888中就是密文传输的,而黑客截取数据想拿到888888这样的数据的话,是需要私钥解密的,私钥又是又服务器保存的,而黑客可以获取的只有公钥,因为非对称是公钥加密私钥解密,所以公钥在传输过程中是透明的,黑客获取到之后也无法破解。只要把888888安全的传输过去,前面的对称加密就可以安全的进行了,因为非对称加密运算量很多,效率很低,只适合传输少量的数据。
但是其实上述问题也存在很大一个漏洞
中间人攻击
中间人攻击就可以破解掉上述加密体系。
此时我们假设有一个客户端和服务器, 服务区生成了一对非对称秘钥( pub1 , pri1 ) ,服务器此时把pub1发送到客户端作为加密对称秘钥的秘钥,此时这个请求pub1被黑客截获了,黑客呢,此时就自己也生成一对自己的非对称秘钥( pub2 , pri2 ) 此时黑客把pub2传给客户端,客户端收到了pub2之后,认为该秘钥是服务器发送过来的,然后就生成了一对对称秘钥,同时用pub2对对称秘钥进行了加密,然后黑客就收到了客户端使用pub2加密的对称秘钥,此时黑客就可以使用pri2来进行解密,此时黑客就可以拿到通信过程中的对称秘钥了,拿到对称秘钥之后,黑客此时用开始拿到服务器传过来的pub1对对称秘钥进行加密,同时发送给服务器。 这样在通信的过程中黑客也能那要对称秘钥了, 上述过程中,黑客在截或服务器的过程中,扮演了客户端,同时在于客户端通信的过程中,扮演了服务器,所以被叫做中间人攻击。
解决中间人攻击
所以不难看出解决中间人攻击的关键其实是,让客户端知道,秘钥是有服务器发送的,而不是由黑客伪造的。
所以我们引入了 证书机制,也就是引入了第三方机构,来证明秘钥是靠谱的。 我们经常在一些特别的网站上面就能看到,什么网站证书已经过期了,这个证书就是这里的这个。
第三方机构具体的认证过程
服务器在使用之前,先去第三方机构申请一个证书,等到第三方机构验证通过之后,就会给服务器颁发一个证书,证书中包含了很多信息,比如 : 服务器域名,证书过期时间,公钥,数字签名等等,其中很重要的一点就是数字签名,数字签名是对上述其他信息的一个验证机制,公正机构会先对其他数据生成一个校验和,同时用自己的私钥对校验和进行一个加密,
此时服务器在发送请求的过程中,就不仅仅只是发送请求了,而是把整个证书都发送到客户端,客户端拿到证书之后,会对证书进行一个验证(检查证书是否合法,是否是被篡改过的)
怎么检查呢,第三方公正机构会把公钥颁发给各种设备,这个公钥不是通过网络传输的,而是在比如Windows系统安装的过程中,系统就会自带知名公正机构的公钥。(因此黑客没办法对这个环节进行攻击) 所以客户端可以使用公钥对数字签名进行解密,得到了校验和的明晚,此时,客户端就可以使用同样的算法,得到同样的校验和,来对证书进行比较,要是相同就说明没有被篡改过。
要是平台在浏览小网站过程中发现证书错误,就说明刚刚的操作就已经被攻击或者篡改过期了。
其实到了这一步,黑客还可以通过伪造公正机构来解决,就不更深入讨论了,我也不会。
fiddler可以抓包,本质是因为在开始https协议的时候,要安装一个东西,本质就是让fiddler成为一个电脑的公正机构,从而实现抓包的,所以fiddler就可以合法的来进行攻击,