前言:本文是加密算法的第三篇文章。第一篇文章《常见加密算法特点及适用场景》
<https://www.cnblogs.com/xtiger/p/10891999.html>
,介绍了常见加密算法及其适用的场景,对加密算法做一个总体的概述。第二篇文章《非对称加密算法-RSA算法》
<https://www.cnblogs.com/xtiger/p/10972373.html>
,通过RSA算法,梳理了不易理解的非对称加密算法的实现思路(对称加密算法由于容易理解,不做过多介绍)。而本篇文章,将通过
HTTPS的通信过程,以一个实例,介绍了各种加密算法在实际中的应用。希望通过三篇文章,能够对加密算法有一个全面初步的了解。(
题外话,个人觉的,对于日常开发,加密算法掌握以上部分内容即可,如果项目有需要,再深入研究也不迟。个人意见,仅供参考!)

 

     HTTPS是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。
HTTPS的通信过程,充分利用了各种加密算法及其特性,本文将通过介绍HTTPS的通信过程,介绍了各种加密算法在实际中的应用。

一、HTTPS安全通信演化过程

     为了更好的说明HTTPS的安全传输原理,我们虚拟了以下的故事。

1、裸奔—明文传输

     洞洞:"呼叫洞妖,呼叫洞妖!"

     洞妖:"我是洞妖,我是洞妖,有啥事?"

     洞洞:"有个关于老板的八卦新闻,你要不要听?"

     洞妖:"快讲,快讲…..."

     于是洞洞和洞妖"宾主双方"就"愉快"地聊起了八卦新闻。

2、有人偷听—对称加密算法

     洞洞:"洞妖,洞妖。我这里又有新的八卦新闻,你要不要听?"

     洞妖:"不要了,上一次我们聊八卦的事情,都被其它人知道了。我们通信都是明文的,在网络上感觉就像裸奔。"

     洞洞:"……,要不这样,我们弄个加密算法,用密钥把我们的通信内容加密一下,传输给你,你通过解密算法用密钥解密,这样就不怕别人监听了,就像这样。"





     洞妖:"好是好,可是密钥你要怎么给我呢?总不能这样刺裸裸的通过网络明文传输密钥吧。"

     洞洞:"这倒也是。要不这样,我下次过去找你,随身带过去给你。"

     洞妖:"成。"

     在洞妖得到密钥之后,他们又可以愉快地聊天了。

3、可以公开的密钥—非对称加密算法

     洞妖:"呼叫洞洞,呼叫洞洞!"

     洞洞:"啥事?"

   
 洞妖:"请教你一个问题,如果我想和其它人在网络上聊天,有没有其它的加密算法,我总不能一个个的先跑到他们身边把密钥当面告诉他们后,再通过网络聊天吧,如果这些人是天南地北的呢?"

   
 洞洞:"有办法。有一种非对称加密算法,它有两个密钥,一个是公钥,可以明文传输的。一个是私钥,由我保存,其它人都不知道。加密和解密算法不同。你通过公钥加密的信息只有我用私钥才能解开,就像这样。"





   
 洞妖:"好方法,那根据这个算法,我生成一套公钥私钥对,你也生成一套不同的公钥私钥对。我们各自告诉对方公钥。我传信息给你的时候,用你给的公钥加密,你用你的私钥解密。同样的,你给我发信息的时候,用我给的公钥加密,我收到信息后用我的私钥解密。"

     洞洞:"聪明。来来来,我再和说一个老板的八卦吧…..."

4、有点慢—非对称加密算法+对称加密算法

     洞妖:"洞洞,洞洞!"

     洞洞:"咋了?"

     洞妖:"你有没有发现,用非对称加密算法进行通信,其加解密过程特别慢?"

   
 洞洞:"是有点慢。因为非对称加密算法运算量大。那要不这样,我们第一次用非对称加密算法传递对称加密算法的密钥,后续通信就用对称加密算法。除了第一次用非对称加密算法加解密密钥的时候比较慢外,其它时间都不会慢了。而且也可以保证对称加密算法密钥的安全性。这样可以充分利用非对称加密算法和对称加密算法的各自特点。"

     洞妖:"妥!"

5、你是谁—数字证书

     洞妖:"洞洞,洞洞!"

     洞洞:"啥事?"

     洞妖:"洞洞,你咋证明你洞洞呢?"

     洞洞:"我去,这不就是和要证明你爹是你爹一个道理嘛。"

   
 洞妖:"哈哈哈,别误会。我想说的是,会不会在我们通信过程中,有个中间人,而我们收到的公钥都是他的,他获取我们的各自消息,然后中转。那他就可以看到我们所有的信息,就像这样(中间人攻击)"

     
洞洞:"我去,如果中间人是老板,那我们不是死翘翘了。看来还是在公钥传输上出问题。你看,要不这样,我们找个可靠的人做公证人,我们各自把公钥交给他。由他让颁布一个证书,证书包含公钥以及我们的身份信息,来证明我们各自的身份。"

     洞妖:"可行,不过如果证书在传输过程中被人篡改,别人偷窥了呢?"

   
 洞洞:"可以让公证人用数字摘要算法,把公钥和身份信息生成一个摘要。同时用非对称加密算法把对摘要进行加密,生成数字签名。然后把【公钥和身份信息+数字签名】合并,形成数字证书。就像这样"

     
洞妖:"嗯,那我在获得数字证书的时候,就可以用公钥进行解密生成摘要信息,再用数字摘要算法对公钥和身份信息生成摘要信息,两者比对,如果能匹配,就说明没有被篡改。"

       备注:数字证书通常来说是由受信任的数字证书颁发机构CA,在验证服务器身份后颁发。

6、谁值得信任—证书内置

     洞妖:"等等,好像还有问题。公证人公钥传输过程也会出现中间人攻击问题。"

   
 洞洞:"我去,我们采用数字证书方式就是为了解决公钥传输的中间人攻击问题,现在公证人的公钥传输也出现中间人攻击问题,死循环了。看来,这个公证人公钥只能事先通过其它途径给你了。"

     洞妖:"我们把公证人公钥预先加载在操作系统中即可。"

     洞洞:"完美!当然,如果操作系统和浏览器的公钥也被篡改,那我们就没招了。所以不要轻易信任安装未知证书。"

     备注:
微软等公司会根据一些权威安全机构的评估选取一些信誉很好并且通过一定的安全认证的证书发布机构,把这些证书发布机构的证书默认安装在操作系统中,并且设置为操作系统信任的数字证书。

二、总结

     HTTPS的信任基于预先安装在操作系统中的证书颁发机构(CA)。可实现防篡改和中间人攻击。它的简易安全通信过程如下: