关于HTTPS

概述

从http迈向https,安全因素是首要因素,大致讲述一下https的流程,表达有误的地方多多包涵。

摘要算法

摘要算法是将任意长度的文本,通过一个算法,得到一个固定长度的文本。常见的有MD5消息摘要算法及SHA家族安全散列算法。

加密算法

有对称加密和非对称加密。
对称加密是在加密和解密时使用相同的密钥,常见的对称加密算法有AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6;对称加密的速度比公钥加密快很多。
非对称加密,它需要两个密钥,一个是公开密钥,另一个是私有密钥;使用公钥加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文;反之,使用私钥加密所得的密文,只能通过对应的公钥才能解密并得到原本的密文。
公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供。

数字签名

我们可以直接对消息进行签名,验证者用公钥正确解密消息,如果和原消息一致,则验证签名成功。但通常我们会对消息的散列值签名,因为通常散列值的长度远小于消息原文,使得效率大大提高。
签名可以保证消息的完整性, 确认消息的发送者身份,同时发送者对发送过此消息的事实具有不可否认性。

CA证书

加入我要申请一个证书,我先在自己搞出来一对公钥和私钥,然后我把公钥和我想生成的证书的一些信息发给证书机构,证书机构人员会审核我的请求,如果认为我是可信的,证书机构会把我的公钥和相关信息组成证书的基本数据,且证书机构用自己的私钥对我的公钥加上数字签名,最后生成证书。
证书一般会包括以下几部分:版本,序号,主体,发行者,有效期开始时间,有效期结束时间,公开密钥用途,公开密钥,公开密钥指纹,数字签名,主体别名。
想要访问我的网站的人可以使用证书机构的公钥验证数字签名,如果验证成功,则可以证明公钥确实是我的,访问网站的人就可以使用证书上的我的公钥来加密明文,把密文发送网站,而我可以使用自己的私钥把密文解密,得到明文。
在本机里,会预置一些CA机构的根证书及其他证书,可以用这些证书去验证其他下一级证书。

HTTPS流程

以访问https://httpbin.org/robots.txt为例,浏览器得到的结果会是

User-agent: *
Disallow: /deny

通过抓包可以分析一下大致过程,关于wireshark如何解析https请看这篇文章。
首先tcp三次握手,然后客户端发出server hello,此时会发出客户端支持的加密方式和一个随机数;
服务端收到请求后,也会发送一个随机数;
然后还会发送该网站的证书,会传输多个证书,这些证书是嵌套关系的,最小层面的就是该网站的证书。根证书会验证它下一级证书,然后直到该网站的证书,由它的上一级的公钥去验证数字签名,验证通过的话,则证明该证书就是CA机构给该网站颁发的,而且是完整的;
证书上含有公钥信息,客户端拿到公钥后,会再生成一个随机数,然后使用公钥对该随机数进行加密,到了服务端,服务端只能用私钥进行解密,此时共产生了三个随机数,前两个随机数是明文的,最后一个随机数是加密的,而且客户端和服务端都知道这三个随机数,然后使用约定的加密算法,会得到一个用于对称加密通信的密钥,为什么又回到对称加密,因为非对称加密的资源消耗太大。
这是通信的总过程,中间还有很多复杂的算法,可以抓包分析一下。
通讯总过程.png

总结

HTTPS的安全是有信的过的机构做支撑,并不是因为有绝对安全的算法,如果中间任意一环机构出问题,那通信也不再安全。

参考链接

维基百科
让面试官膜拜你的HTTPS运行流程(超详细)
如何用 wireshark 抓包 TLS 封包
数字签名是什么?

原文地址:https://www.cnblogs.com/python-dd/p/12643167.html