本篇博客,参考了以下链接:
https://blog.csdn.net/L835311324/article/details/81540641
https://www.cnblogs.com/rinack/p/10743355.html
一、HTTP和HTTPS的区别
- 使用HTTP传输的内容是明文,没有经过任何加密,而HTTPS传输的是密文。
- HTTP使用的默认端口 是80,HTTPS使用的默认端口是443。
- HTTPS协议是其实是HTTP+SSL或TLS构建的可加密传输、身份认证、数据完整性保护等网络协议。
下面会就HTTPS提供的这三个功能进行详细讲解。
二、加密算法
在讲解HTTPS中的身份认证的时候,必须要先了解加密算法。通常加密算法分为两类,一类是对称密钥加密算法,另一类是非对称密钥加密算法。
1、对称密钥加密算法
如图,通信双方使用的是同一个密钥进行加密和解密。但是这有个问题,如何才能安全地分发这一对密钥。所以就有了非对称加密。
2、非对称密钥加密算法
每个用户都有一对密钥即一个公钥和一个私钥,其中公钥是大家都知道的,私钥是只有自己才知道的,对一段信息用其中一个密钥加密,再用另外一个密钥解密可以获得原始信息的内容。
所以这就会有两种加密方式:
- 第一种是使用某个用户的公钥加密后传给对方,对方收到后用自己的私钥解密,这种方式是安全的,因为解密的密钥只有自己才知道,这通常用来加密(如上图)。
- 第二种是使用某个用户的私钥加密后传给对方,对方收到后用自己的公钥解密,这种方式是不安全的,因为自己的公钥是大家都知道的,有可能将内容泄露出去,这通常用来做数字签名。
二、HTTPS中的身份认证和完整性校验
1、数字签名
数字签名的定义是接收者能够确认自己得到的信息确实是由该信息所声称的发送者发出的,而不是由非法入侵者伪造、冒充发出的,而且还要能够保证信息在传送、存储中没有被恶意篡改。
身份认证就是用上一节提到的非对称加密,即先用自己的私钥对这段内容加密后发给对方,然后对方使用发送者的公钥解密,如果使用能成功解密,代表这条消息确实是发送者那里发出来的。
要进行数据完整性的校验,需要先求内容的消息摘要,可以使用MD5、SHA、HMAC
等哈希算法。这些算法是单向的,只要原始报文一改变,则得到的消息摘要必然发生变化,由此可以推测出数据在传输过程中是否被篡改过。
数字签名流程如下图:
RSA非对称加密结合MD5数字签名的具体步骤:
- 信息发送者A要向B发送一份信息,A先按双方约定的哈希算法对该信息进行哈希运算,得到一个该信息特有的消息摘要H。哈希算法保证了只要改动信息中任何一位,重新计算出的消息摘要就会和原先的不相符,这样保证了信息的不可更改性。
- 接着把消息摘要用A自己的私钥加密,得到A对该信息的数字签名S。
- 但B收到后,先用A的公钥对数字签名S解密得到A的消息摘要H。
- 再用同样的哈希算法对接收到的信息进行哈希运算,得到消息摘要H’。
- 比较H和H‘,如相等则说明信息确实来自它所声称的发送者A。
2、数字证书
如果通信双方直接使用非对称加密,其实也是不安全的,如果中间人截获了用户A发给用户B的请求,并将该请求替换为中间人自己发起的请求,那么该请求由用户B回传给中间人的时候,用户B会使用中间人的公钥对内容进行加密,那相当于中间人直接拿到了双方聊天的内容,那这样也是不安全的。
为了解决非法入侵者可以冒充通信系统中的一方,像这个通信系统中公布一个冒充的密钥的问题,需要用到数字证书和PKI(Public Key Infrastructure—公开密钥基础设施)。其中CA是唯一能够发布和撤销证书的机构。
数字证书的组成部分:
- 版本号
- 序列号:由CA给每一个证书分配唯一的数字型编号。
- 签名算法识别符:用来指定CA签发证书时使用的公开密钥算法和哈希算法。
- 发行者名称:建立和签署证书的CA名称。
- 有效期:包括证书开始生效的日期和证书失效的日期。
- 主体名称:证书持有人的姓名等信息。
- 主体的公钥
- 发送者唯一识别符:可选。当CA的名称重新用于其他实体时,用这一识别符来唯一标识发行者。
- 主体唯一标识符:可选。当主体的名称重新用于其他实体时,用这一识别符来唯一识别主体。
- 扩充域:其中包括一个或多个扩充的数据项。
- 签名:CA用自己的私钥对上述各数据项的哈希值进行数字签名的结果。
三、访问HTTPS中整个流程
- 用户访问HTTPS的网站,会先从服务器下载数字证书。浏览器会根据证书中提供的公钥对证书中的数字签名进行解密,得到证书的摘要,这可以保证该服务器是真的服务器。
- 浏览器根据证书中指定的数字摘要的生成算法,对该证书重新计算哈希,得到新的摘要。
- 比较第一步和第二步产生的摘要,如果两个摘要相同,说明是真的证书。
- 客户端随机生成一个密钥使用证书中的公钥发送给服务器。
- 服务器收到之后用自己的私钥解密,即可获得双方通信的密钥。
- 下次通信的时候,双方对内容该进行对称加密,密钥就是上面客户端随机生成的密钥(只不过此时的密钥服务端和客户端都知道了)。