HTTPS 本质上就是 HTTP 的基础上增加了一个加密层,抛开加密之后,剩下的部分就和 HTTP 是一样的,在HTTPS中,比HTTP多了一个"S",这里的S是SSL。HTTPS=HTTP+SSL。
HTTPS引入的背景是臭名昭著的运营商劫持
在当年,法律在互联网相关的东西上面还不是很完善
在使用https,加密的过程中,涉及到了密码学中的几个核心的概念
(1)明文:要传输的真正的意识是啥
(2)密文:加密之后得到的数据
(3)密钥:用来加密和解密的重要道具
这个过程简单来说就是,把明文通过密钥变成密文 ,把密文通过密钥变成明文
对称加密和非对称加密
对称加密:加密和解密,使用同一个密钥就行了,加密解密速度比较快。
非对称加密:密钥是一对(分别称为公钥和私钥)加密解密速度比较慢,安全性更高。可以使用公钥加密,此时就是私钥解密。或者可以使用私钥加密,公钥解密.
HTTP本身是不安全的,为了能够安全,最简单的做法就是使用对称加密来进行操作
这里有一个问题
对称密钥,当有多个客户端的时候,是要有一个密钥还是多个密钥??所有客户端使用同一个对称密钥,还是每个客户端有一个自己的呢?
(1)对称密钥
如果只有一个密钥,黑客使用自己的客户端,不就知道密钥是啥了嘛~~黑客就可以把密文进行解密了呀~~
所以让每个客户端生成一个自己的密钥,让后告诉服务器就可以了
在这里就又有一个新的问题了,如图所示
在上述过程中,密钥在第一次传输的时候,也可能被黑客获取到,那之后的的加密也就是形同虚设了。
(2)非对称密钥
在这里我们引入非对称密钥,通过非对称密钥,对对称密钥进行加密
引入非对称加密,不是针对后续传输的数据内容展开的,而是只针对对称密钥来进行!!
在上述过程中,客户端持有公钥,服务器持有私钥,通过公钥对对称密钥进行加密,服务器用私钥解密,得到对称密钥。
黑客拿到加密后的对称密钥之后,是无法解密的,使用公钥加密,得拿着对应的私钥来解密,黑客能轻松拿到公钥,但是拿不到私钥
上述过程中看起来很美好,实际上黑客还是有办法获取到原始数据的
(3)中间人攻击
黑客可以自己冒充自己是服务器
在上述过程中,服务器生成一对公钥和私钥(假设是pub和pri),再把公钥发给客户端的途中,黑客获取到,黑客可以自己生成一对公钥和私钥(pub2和pri2),让后把自己生成的公钥发给客户端,让后客户端基于黑客给的公钥来加密密钥,黑客就可以根据自己的密钥来进行解密,得到其中的密钥,让后用服务器给的公钥来加密,再返还给服务器。
此时黑客面对客户端的时候,扮演服务器的角色,面对服务器的时候,扮演客户端的角色,客户端和服务器, 都不知道 黑客的存在~~
(4)解决中间人攻击
最关键的切入点,就是让客户端能够区分出当前的公钥是不是服务器自己的公钥,是不是被伪造出来的公钥~~
在这里引入第三方公证机构。
公证机构对公钥进行公证,此时客户端看到这个公钥被公证了,就可以认为是合法的了
在上述过程中,服务器上线就会向第三方公正机构申请一个证书,此时服务器就会保存好自己申请道德证书(不是字纸的,而是数字的字符串)。之后返回给客户端
(1)客户端收到证书后,会对证书的合法性进行校验,针对证书中的内容1.发证机构2.证书的有效期3.服务器的公钥4.证书的所有者5.持有者网站的主域名6.数字签名。在上述的6个内容中,只有数字签名是加密的 ,其他的属性都是明文的。数字签名是前5个内容进行加密得到的,前5个内容计算的校验和为校验和1
(2)针对数字签名进行解密
数字签名是基于公正机构的私钥来加密的,就需要拿着公正机构的公钥来解密,获取公正机构的公钥,不是通过"网络"的方式获取到的 !!!通过网络的方式,就可能会得到黑客伪造的公钥,而是操作系统会内置公正机构的公钥!!
公正机构,一共没有多少,你一个操作系统, 就可以在发布的时候,把市面上的公正机构的公钥都打包放到一起。随着安装操作系统,公钥就有了!(系统内置的公钥,一定是正经公钥,不是伪造的!!
(3)客户端对比校验和1和校验和2是否相等
接下来,就可以使用公正机构的公钥 (系统内置)来对数字签名进行解密了,解密之后得到校验和 2,客户端会对比校验和1和校验和2是否相等,相等就说明整个证书,都是没有被篡改过的,此时,证书既然都是有效的,证书中包含的公钥自然就是可信的服务器公钥了。
针对公正机构加密的数字签名,进行解密是很容易的,公正机构的公钥是内置到系统中的,用户可以解密,黑客当然也能解密了
黑客很容易能拿到校验和,虽然能拿到,但是无法篡改,也无法伪造!!!
1)如果黑客修改了证书中的公钥,但是不修改数字签名,客户端校验的时候就会发现,自己算出来的校验和和从数字签名中解密出来的校验和,不一致了!!!客户端就可以判定,证书非法!
2)如果黑客修改了公钥, 并且自己重新计算校验和,重新加密得到数字签名??
黑客不知道公正机构的私钥是啥。黑客只能拿着自己生成的私钥来加密,客户端收到数据之后,肯定是拿着公正机构的公钥来解密,此时就会出现解密失败!!客户端也可以判定,证书非法~~
大家还记得在安装fidder,开启https的时候,会有一个"安装证书"过程,必须要选同意!!
这个过程就是给你的系统里增加一个公证机构,fiddler的公证机构