从对称加密到数字证书

对称加密

​ 简单来说,对称加密是解决通信之间的安全问题的最初手段。如下图中张大胖同学通过网络结识了远在美国的Bill同学,两个人聊得水深火热,但是有一天张大胖开始变得疑神疑鬼,因为他们聊得内容越来越隐私。张大胖就跟Bill说我总感觉不安全,我感觉有个人通过截取我们的消息在偷窥我们讲话,Bill听了也连忙说,对!我们的消息都是明文传输,中间被人截获就直接被读出来了。那怎么办?加密呗!

​ 说着,张大胖就提议,不是有个对称加密嘛?我们用那个进行对消息的加密,我们首先沟通好我们的私钥,保持一致性,我给你发消息的时候我通过私钥加密,你收到消息的时候你再通过私钥进行解密,这样即使被中间人截获他也看不懂啦!Bill连忙夸赞张大胖同学说:”dei dei dei这个办法好呀!”。

​ 就如下图中一样,张大胖和Bill就通过对称加密来进行通信,看似安全了,但是真的安全了吗?

​ 可是,当张大胖和Bill开始协商秘钥的时候,问题又出现了!Bill说既然网络是不安全的,万一现在正好有人再偷窥我们协商秘钥,我们协商好之后通过网络传输,这个秘钥就是明文传输的呀!那么,我们的秘钥不就暴露了吗?张大胖听了Bill的一席话,幡然醒悟。“对呀!这个可怎么办?而且当两个人进行通信的时候就要一个秘钥,一个人如果需要同一百个,一万个好友进行通信的时候那么就要有一百个,一万个秘钥,这!这哪能记得住呀?“。Bill这时候说道:“不行不行!这个通信方式也不安全!我们得再想一个。”

非对称加密

​ 张大胖和Bill得知这种办法也不行的时候就一直提心吊胆地通信着,都不敢涉及隐私了,这个偷窥者听得也没劲了。直到后来,Bill听说了一种叫RSA非对称加密的算法,他一下子来了灵感。

  RSA算法意思是一个人同时拥有公钥和私钥,这个公钥是公开的,别人都可以知道,但是这个私钥是自己保存的,千万不能让别人知道。而且,当文本经过某个人的公钥加密的时候,只有通过这个人的私钥才能进行解密,所以当Bill向张大胖同学发消息的时候,他就使用张大胖的公钥对消息进行加密,当张大胖收到消息的时候他就使用自己的私钥进行解密。流程如下图:

非对称加密+对称加密

​ 这样,非对称加密就一下子解决了对称加密的两个缺点(秘钥泛滥和秘钥被网络截取),但是它也带来了一个很致命的缺点,那就是——效率问题,对同样大小的文本对称加密的速度是非对称加密速度的几百倍(我曾经拿RSA算法对一个50kb的文件进行加密,电脑直接叫唤着我不行了,我不行了)。大家知道通信是很讲究速度效率的,这个非对称加密虽然安全但是速度太慢了,这叫人怎么能忍呢?

​ 这么愚蠢的问题当然不会困惑张大胖和Bill很久,他们想出来了一个二者结合的方法!当张大胖和Bill要进行通信的时候,他们就先使用非对称加密沟通好对称加密的秘钥(也就是在这个非对称加密的通道里传输秘钥)这样秘钥就不会被截获了,就算截获也是密文,偷窥者没办法呀。然后双方就使用刚刚非对称加密通信产生的对称加密的秘钥来进行加密解密,这样一来安全问题和效率问题就得到了很好的解决啦!

中间人劫持

​ 现在张大胖和Bill就很欢快地聊起来了,但是问题就这么简单地结束了吗?当然没有!张大胖把自己和Bill的聊天情况告诉了他女朋友,女朋友一听就发现了一个问题,她说:“Bill给别人,给你发公钥的时候也是通过网络传输的呀!那么这时候有个中间人把这个公钥给劫持了,再把自己的公钥换掉Bill的公钥发给你,你收到的就是中间人的公钥呀!那么你通过中间人的公钥进行消息加密发给Bill,这时候中间人再次劫持消息,通过他的私钥进行解密就直接能获得消息的内容了,然后他再把解密完的消息或者自己编造一个假消息然后使用Bill的公钥进行加密发给Bill,这样就神不知鬼不觉的解密了你们的消息并且还能冒充身份和造假消息!!!张大胖一听,后背就开始发凉,难道自己和Bill发的生活照都被中间人截取了吗???这可怎么防呀?

数字签名和数字证书

​ 但是怎么安全地分发公钥呢? 似乎又回到了最初的问题: 怎么安全的保护密钥?这真的是一个很头痛的问题呀!可是似乎和最初的问题还不一样,这一次的公钥不用保密,但是一定得有个办法声明这个公钥确实是Bill的, 而不是别人的。这让张大胖想到了一个现实中的问题——签名。像我们签合同,协议都是通过签名来确定这个本人,那么我们可以把它移植到网络上!怎么移植呢?

​ RSA算法给我们提供了一个很好的办法,因为它不仅可以通过公钥加密私钥解密,它还可以私钥加密公钥解密。这样我们发送公钥的时候可以通过某个消息摘要算法,首先这个消息摘要算法必须有两个特性——不可逆性和可变性。不可逆好理解,就是无法通过密文解出明文,这个可变性就是指当消息发生一点点变化的时候,它形成的密文就会发生翻天覆地的变化,这样就可以防止别人修改。这时候我们通过消息摘要算法来对公钥进行加密形成摘要,然后我们通过自己的私钥对这个摘要进行加密形成摘要密文,这个摘要密文就是我们的数字签名。这样,我们发公钥的时候就发送原本的消息附加上我们的数字签名,这样对方收到这个消息的时候就使用收到的公钥对这个数字签名进行解密(得到其实就是公钥的摘要),然后再通过同样的消息摘要算法对收到的公钥进行加密,如果对公要的加密密文和数字签名解密出来的东西是一样的,那么久说明这个公钥没有被修改过!

​ 可能有点难理解,我们这么想,如果中间人对这个公钥进行了修改或者替换。比如张大胖和Bill在通信,张大胖把自己的公钥和数字签名发给了Bill,中间人截获这个消息,假如他替换了公钥(替换成自己的了),那么他也不能改动数字签名,使数字签名通过这个公钥来形成中间人公钥的信息摘要,因为这个数字签名就是密文,他不知道如何下手,所以如果只改公钥,那么这样肯定会被Bill发现。但是,作为一个狠角色,要干就要干狠一点,不能改公钥,不能改数字签名,老子干脆就把它全改了,全用自己的!

​ 所以问题又来了,这时候我们就要请来大人物了——认证中心(CA),我们需要有一个具有公信力的中间商,当我们把自己的公钥和个人信息形成消息摘要的时候,我们使用CA的私钥进行加密形成数字签名。

​ 然后我们发送消息的时候我们把我们的公钥和个人信息再连带着使用CA的私钥加密过的数字签名发送给对方,这些东西合起来就有另一个名字——数字证书。

​ 如图所示,当Bill吧这个数字证书发给张大胖的时候,我就用同样的消息摘要算法对原本消息进行摘要,然后使用CA的公钥对数字签名进行解密获取摘要,然后对比我前后获取的摘要,如果一致那么就说明这个东西没有被篡改。你想想,如果中间人截获了这个证书,他把证书全改成自己的,但是张大胖使用的是CA的公钥解密摘要,然而中间人不知道CA的私钥,那么他这么做就露馅了!这时候张大胖就安全地拿到了Bill的公钥,后续的加密工作就可以顺利地进行了。当然,网络本就是不安全的,想必大家也想到了,当Bill获取CA的公钥的时候,这个中间人也可以发起攻击,直接篡改CA公钥,那么这样安全问题就无限的循环下去无法解决了!当然这些CA本身也有证书来证明自己的身份,并且CA的信用是像树一样分级的,高层的CA给底层的CA做信用背书,而操作系统/浏览器中会内置一些顶层的CA的证书,相当于你自动信任了他们。这些顶层的CA证书一定得安全地放入操作系统/浏览器当中,否则世界大乱。

HTTPS

​ 这样,https也非常好理解了,看图就知道了。

​ 本博文参考于刘欣的《码农翻身》,特别感谢此书,也推荐大家阅读。

后记

​ 好久没写博客了,因为这学期以来就有一大堆事情要解决处理,有时候学习完,就一直没时间写总结。总感觉自己像头狮子一样,想一口气吃成大胖子,什么都要学,什么都学不精,学了之后不总结,学了就忘。当然有好奇心也是好事,但是我可不想无法精通一门东西,昨天看这本《码农翻身》,书中提到了不要让碎片化信息侵蚀你深度思考的能力,确实如此,我们现在学习知识都是以一种常识的心态去学,我们只是记住了这个常识,死记硬背,并没有深度思考其中的原因和逻辑,所以我们无法精通一门技术,我想,这大概是我现阶段学习最大的问题吧。

-------------本文结束感谢阅读-------------