HTTPS也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层
HTTP协议的内容都是按照文本的方式明文传输。这就导致了在传输过程中出现一些被篡改、被盗取信息的情况。
我们是否记得报头中有Referer这个键值对,它表示此链接是从哪个网页跳转跳转过来的。如下面我使用搜狗引擎搜索“贪玩蓝月”,我们能抓到这样的包:
表示我们从搜狗转到了这个网站。这个时候搜狗厂商就能从贪玩蓝月哪里收取一定的广告费。
但是在2014~2016会经常发生运营商劫持的事件,运营商的相关设备收到这个请求后,会把Referer这个键值对的值改为自家产品的搜索引擎,而其他搜索引擎就赚不到钱。运营商为什么这样做?就是利益。
这还是没有损害网民的利益,毕竟最终跳转的还是相同的目的地址。但是如果有黑客在你需要下载其他软件的时候,把地址改为病毒或者流氓软件的下载地址就可非常可怕了。
这时候我们需要对发出的请求进行加密,以防止第三方的篡改。
加密就是把 明文(要传输的信息)进行一系列变换,生成密文
解密就是把 密文 再进行一系列变换,还原成 明文
在这个加密和解密的过程中,我们往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为 密钥(正确读音Mì yuè,但是很多人读作mi yao第四声,是错误,但我们在别人读这个的时候知道是什么)
在83版的《火烧圆明园》,有人要谋反干掉慈禧太后。恭亲王奕䜣给慈溪太后递了个折子。折子的内容只是和慈溪太后聊了些家常,但是又套上的一个挖了洞的纸,套在原来的折子上就变成了另外的意思。
密文:奏折全文
明文:套上带孔的纸看到的内容(当心肃顺, 端华, 戴恒)
密钥:挖了洞的纸
加密解密到如今已经发展成一个独立的学科:密码学。
而密码学的奠基人,也正是计算机科学的祖师爷之一:艾伦·麦席森·图灵
既要保证数据的安全,我们就要对数据进行加密
我们使用的加密方式有两种:对称机密 和 非对称加密
对称加密:就是通过一个“密钥”,我们可以对响应的信息进行加密,同时又可以对响应的信息进行解密。
一个简单的对称加密,按位异或
假设明文a = 1234,密钥key = 8888
我们加密a ^ key = 9834,其中9834就是我们得到的密文
然后对方收到信息以后,9834 ^ key = 1234
这就是加密和解密的过程。
但是HTTPS并不是简单的按位异或,但是这能很好的解释:对称加密/对称密钥
假设我们在传输的时候,服务器和客户端都已经得到了对称密钥。
客户端将要发送的信息进行加密传输,由于黑客并没有对称密钥获得得信息只是密文,看到的就是无意义的数据,服务端拥有密钥将很快的解密,并进行响应对响应得信息进行加密, 密文2的信息黑客同样无法解密,将发送给客户端,客户端拥有密钥,将对信息进行解密。
引入对称密钥后,虽然黑客获得了信息,但是却是无意义的数据。
【通俗的栗子】
我们假设这个过程是发送信封和收信封的过程。
不使用对称加密:我们直接把信封给了不正经的送信员,他在中途的时候可以拆开看看,然后再次封装起来,送给我们的收信人。
使用对称加密:发信人和送信人都有一个相同的保险箱和钥匙。发信人把信封放入保险箱锁好,交给快递员。快递员由于保险箱的存在将无法偷看里面的信息,便继续往下发送。收信人收到保险箱后,就开锁看信。并使用类似方法进行回信。
关于如何获得对称密钥?
每个对称密钥都是客户端自己随机产生,并发送给服务端(中间也有加密,我们先不考虑),服务器会记录这个对称密钥,用于和此客户端交流。因为密钥是客户端随机产生的,所以每个客户端跟服务进行数据传输使用的是不同的密钥。
但是如果我们发送这个对称密钥的时候,黑客截取到这个对称密钥,我们的信息还是变成不安全的了。我们要如何安全的传输这个对称密钥呢,这就要看接下来的内容了。
非对称加密,要用到两个钥匙,一个叫“公钥”,一个叫“私钥”。
公钥和私钥是成对出现的,
【公钥和私钥的区别】公钥就是明文传输的客户端的内容,客户端会使用它加密对称密钥。私钥就是服务端自己保留的。服务端产生的一对非对称密钥,谁做私钥,谁做公钥是没有区别的,区分的关键就是哪个是服务器保留的,哪个是服务器发送给客户端的。
我们引入非对称密钥后,请求就变成了这样:
【通俗的栗子】
我们需要收信人和发信人都使用相同的保险箱和钥匙,但是这个保险箱只有发信人有,我们将如何送给收信人呢?
【对称密钥和非对称密钥的优劣】
【对称密钥】加密和解密速度快
【非对称密钥】加密和解密速度慢,但是由于私钥没有在网络中传输,是安全的。
【非对称密钥更加安全的原因】
我们发送信息的时候,只把公钥进行了网络传输,这个公钥,只是用来加密的,是没有解密功能的。同时私钥一直是服务器持有,没有经过网络传输,所以是安全的。
但是我们这样做就真的安全了吗?
【通俗的栗子】
- 首先送信人写了封信,要求建立连接;
- 收信人收到后,把保险箱1交给不正经的送信员,并把钥匙1自己保留;
- 不正经的送信员收到保险箱1后,把它替换成自己的保险箱2,并发送,钥匙2自己留下;
- 送信人收到后,认为这是收信人发送的保险箱,就把以后交流的密钥放在里面,锁好并交给不正经的送信员;
- 送信员收到后,使用钥匙2开锁,查看里面的密钥,并把密钥放入保险箱1锁好,送给收信人;
- 收信人收到后,是已经锁好保险箱1,认为这就是收信人送来的,并开锁,查看密钥,进行之后的交流。
就真的没有破解这种困境的方法了吗?我们看以下的内容。
解决中间人攻击的关键在于:让客户端相信这是服务器发来的公钥。
在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书
这个证书包含了刚才提要的公钥,也包含了网站的身份信息。这些证书包含了以下的信息:
相关机构会对证书的内容/属性等相关内容进行计算得到一个哈希值,并放入证书中,使用机构自己的非对称密钥进行加密签名。由于每个计算机内部都内置了这公钥可以用来解密,从而验证证书的真实性。
当客户端获取到这个证书以后,会对证书进行校验(防止证书是伪造的)
【完整的过程】
这里的关键是黑客无法仿造证书,同时客户端会验证证书的真实性,使得正确的公钥2发送给客户端。