这个知识点我觉得特有意思,来记录一下。
首先讲一下Http为什么不安全?我们用下面这个例子来打个比方。
假设你坐在一个教室里,你现在非常想把某个信息传递给教室里的另一个人,一般来说,会选择,传纸条。传纸条这个比喻其实非常正确,这就是互联网的一个基础协议 TCP/IP 协议基本的工作模式。而通常,HTTP 协议的数据是使用 TCP/IP 协议进行发送的。HTTP 指的是你在纸条上写明你要传送的目的地是哪个同学的坐位,然后再是要传递的内容。途径的同学拿到纸条后根据纸条上显示的地址依次传过去就好了。这样要面临的第一个问题就是:途径的同学可以完全知道你写了什么。
这就是为啥Http不安全,途径的位置都可以知道你要发送的内容。
所以我们要对信息进行加密,简单介绍下三种常见的加密方式:
1.对称加密 : 加密和解密数据使用同一个密钥。这种加密方式的优点是速度很快,常见对称加密的算法有 AES;
2.非对称加密: 加密和解密使用不同的密钥,叫公钥和私钥。数据用公钥加密后必须用私钥解密,数据用私钥加密后必须用公钥解密。一般来说私钥自己保留好,把公钥公开给别人,让别人拿自己的公钥加密数据后发给自己,这样只有自己才能解密。 这种加密方式的特点是速度慢,CUP 开销大,常见非对称加密算法有 RSA;
3.Hash: hash 是把任意长度数据经过处理变成一个长度固定唯一的字符串,但任何人拿到这个字符串无法反向解密成原始数据(解开你就是密码学专家了),Hash 常用来验证数据的完整性。常见 Hash 算法有 MD5(已经不安全了)、SHA1、SHA256.
有一种办法是把纸条的信息对称加密。我们来具体化这个场景,小邬要把这个纸条经过小王传给小只,前面说http不安全,就是小王会通过以下4种方式来干扰到小邬。
1.收到小邬的纸条后扔掉纸条。但这样做小邬收不到回应下课会去单独问小只,事情就败露了
2.偷窥纸条的内容,然后举报给老师
3.收到小邬的纸条后,小王立即给小邬发一个回复纸条:“我不喜欢你,我喜欢小王”。同时小王给小只发一个纸条:“我是小邬,你长的真丑,嘿嘿”
4.正常帮小邬和小只投递纸。但复印一份小邬的纸条,过两天小王把这个纸条发给了班里的其他女生小花。
可以看出来这个小王吧,是非常腹黑的。ok,那我们就把纸条的信息对称加密。但是小只不知道这个加密的秘钥,无法解开。如果把秘钥写在纸条里,那么小王就知道了,没有意义。这样不行,换种思路。
小只可以生成一对公钥和私钥,把公钥公开给班里所有的同学,这样小邬就能得到公钥。如果小邬够聪明的话,他得到公钥后会生成一个对称加密AES的密钥,然后用小只的公钥把 AES 密钥加密(AES 密钥长度很短加密几乎不需要时间),然后把加密后的密钥发给小只。小只收到后用私钥解密,得到小邬的对称加密密钥,然后就可以用这个只有他们俩知道的对称密钥加密数据进行交流。
完美。但仔细一想可能有这么几个问题。既然非对称加密可以那么安全,为什么我们不直接用它来加密信息,而是去加密对称加密的密钥呢?
这是因为非对称加密的密码对生成和加密的消耗时间比较长,为了节省双方的计算时间,通常只用它来交换密钥,而非直接用来传输数据。
自以为天衣无缝,但这种真的安全吗?实际上不安全。见下:
小只公开秘钥的时候,小邬正巧拉肚子不在。等小邬回来的时候,问小王,小只的公钥是多少。小王腹黑,告诉小邬自己生成的假公钥。这样等小邬通过这个假公钥来对AES秘钥加密的时候,小王就可以解开这个秘钥,从而解开信息。而小只却解不开。
小只知道后不行,得找班长给自己做信用背书,正好前两天班长在班里通知了自己的公钥。于是小只找到班长,做了一个证书,证书上有自己的名字、学号、公钥、公证人班长的名字,同时把这些信息通过 Hash (SHA256)处理后请求班长用自己的私钥进行加密(为什么用 Hash 处理?因为东西太多非对称加密很费时),也放到证书上。于是小只再次把证书通报给班里所有的同学。
小邬这次得到了证书,发现上面的公证人是班长,于是先用班长的公钥对证书上被班长私钥加密后的字段进行解密,得到元素数据的 Hash。 再对元素数据进行 Hash和刚刚解密的 Hash 进行比对。如果比对成功表示证书上的信息无误,且是由班长担保的。这时候小谷确信证书上的公钥就是小美的。任何人因为没有班长的私钥都无法伪造证书。
还是有一个问题如何判断班长的公钥是他本人的呢?如果有人伪造班长的公钥以及证书,那跟上面的情况一样,信息被泄露。
这个时候他发现班长的证书上有班主任的担保(班主任的公钥做了签名),班主任的证书上有校长的担保,而小邬是有校长的的公钥的,就印在学生证上。
终于,小邬把信息安全的传出去了。
故事完了。故事中 小邬是浏览器,小只是服务器,小王是坏蛋,班长是 CA 机构,班主任是上级 CA,校长是根 CA 服务器。当一个网站要使用 https 时先需在一些国际认证的 CA 机构填写网站信息申请证书,而这些 CA机构往往还有上层 CA,最终有一个根 CA。一般来说浏览器都会内置根 CA 和一些顶级 CA 的证书,但需要验证的时候会通过 CA 链逐级验证。