HTTPS协议,看这篇就够了

不安全的HTTP

近些年来,越来越多的网站使用 HTTPS 协议进行数据传输,原因在于 HTTPS 相较于 HTTP 能够提供更加安全的服务。
很多浏览器对于使用 HTTP 协议的网站会加上『警告』的标志表示数据传输不安全,而对于使用 HTTPS 协议的网站会加上一把『锁』标志表示数据传输安全。

在这里插入图片描述

为什么 HTTP 协议不安全呢?主要表现在以下三个方面:

  • 容易被窃听:HTTP 传输的数据是明文。黑客很容易通过嗅探技术截获报文,由于数据没有加密,内容可以被黑客所理解。举个例子:如果用户输入密码取款,那么黑客窃听了此密码后,就可以为所欲为了!
  • 容易被篡改:黑客可以在截获 HTTP 报文后,对报文进行修改,然后再发送到目的地。举个例子:如果用户想要转账给家人,而黑客将收款人修改成了自己,将会造成用户出现损失!
  • 容易被伪造身份:黑客可以伪造 HTTP 报文,假装自己是用户真正想要访问的网站,然后与用户进行通信。举个例子:如果用户想要访问淘宝网站进行购物,而黑客冒充自己是淘宝网站,用户就可能在此假淘宝网站上买东西,造成损失!

HTTPS 是如何解决以上安全性问题的呢?主要方法如下所示:

  • 数据加密:HTTPS 传输的不再是明文,而是采用加密算法传输密文,黑客即使截获了报文,也无法理解内容!
  • 完整性摘要:HTTPS 通过摘要算法得到报文的一个摘要,如果黑客篡改了报文内容,那么重新生成的摘要将发生变化,接收方校验后就知道数据不再完整,被篡改了!
  • 数字证书:HTTPS 通过数字证书来验证通信实体的身份,而黑客因为没有相应的证书,一旦冒充其他网站将会被识破!

加密算法

为了防止传输数据被黑客所窃听,客户端与服务器之间需要对数据进行加解密处理。
发送方使用加密算法将明文加密为密文,而接收方使用相应的解密算法将密文解密为明文。黑客只能看到密文,因而并不能获取到任何有用信息。如下图所示:

在这里插入图片描述

一般来说,加密算法分为两大类,对称加密非对称加密

  • 对称加密:指加密和解码使用同一把密钥,即图中的密钥 A 等于密钥 B;
  • 非对称加密:指加密和解密使用不同的密钥,即图中的密钥 A 不等于密钥 B。

对称加密

对称加密算法中加密和解密的钥匙是同一把,称之为密钥
凯撒密码是一种较为简单的对称加密算法,可用于对英语文本进行加解密。其主要思想是:将明文中的每个字母按照字母表所在位置右移 K 位,得到密文(允许回绕)。
举个例子,设 K = 2,那么明文中的字母 “a” 用字母 “c” 代替,字母 “z” 用 字母 “b” 代替。此时 K = 2 就是对称加密算法中的密钥。

在这里插入图片描述

这种方式的缺点在于:每个字母经过加密后只有唯一的密文表示,如果黑客收集了很多数据后进行统计分析,很可能就破解了加密手段。
更好的方式是采用多个凯撒密码 K 轮询进行加密,比如位置为奇数的字母采用密钥 K = 2 加密,位置为偶数的字母采用密钥 K = 3 加密。

在这里插入图片描述

然而凯撒密码只能加密英文文本,若想要加密所有字符,可以采用分组加密的方式。
我们知道任何数据在计算机中实际存储的是 0/1 比特的组合。分组加密的主要思想是:将要加密的报文处理为 K 比特的分组,每个分组通过一对一的映射表进行加密。
举个例子,设 K = 3,映射表如下图,那么报文 010110001111 将会被加密为 101000111001。此时 K=3 以及映射表就是对称加密算法中的密钥。

在这里插入图片描述

与前面采用多个凯撒密码 K 作为密钥的方式一样,为了增加破解的难度,一种更好的方式是采用多个映射表,轮询对数据进行加密。
计算机网络中常用的对称加密算法有:DES、3DES、AES 等,都属于分组加密算法。

非对称加密

非对称加密算法中加密和解密的钥匙不同,分别称为公钥私钥。其特点在于:

  • 如果用公钥加密,则只能用私钥解密,此时公钥是不能解密的。
  • 如果用私钥加密,则只能用公钥解密,此时私钥是不能解密的。
  • 公钥是对外公开的,任何人都能够得到;私钥只有自己知道,不能泄露。

为什么有了对称加密后还会出现非对称加密呢?
原因在于对称加密的前提是通信双方需要商量出一个密钥,而商量密钥的时候传输的是明文,如果此密钥被黑客所截获,即使后面的报文进行了加密,黑客也可以通过此密钥进行解密!

在这里插入图片描述

非对称加密的一个特点是:公钥加密,只有私钥可以解密。那么就无需像对称加密那样提前协商好密钥。通信双方可以直接将自己的公钥发送给另一方,这个公钥即使黑客知道也无所谓,当一方用此公钥加密后,即使黑客截获了报文,也无法用公钥解密,只有拥有私钥的另一方才能解密成功!

在这里插入图片描述

计算机网络中常用的非对称加密算法有:RSA、 ECDHE 等。
相较于对称加密,非对称加密算法更加复杂难懂,数学推理较多,如果对具体算法感兴趣的,可以看一下阮一峰的两篇文章:RSA 算法原理(一)和 RSA 算法原理(二)。
https://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

混合加密

前面提到,对称加密算法需要提前协商出密钥,而协商的过程用的是明文(因为还没有密钥),如果黑客截获了明文密钥,那么之后即使加密了,黑客也可以用密钥进行解密,此时就无安全性可言了!
非对称加密算法解决了此问题,但是其存在大量的指数运算,加密速度非常慢!而对称加密算法的加密速度非常快,一般是非对称加密算法的 100-10000 倍!
那能不能将二者综合起来,使得数据传输不仅安全且高效呢?答案是肯定的!HTTPS 采用混合加密方式,既采用对称加密,也采用非对称加密。
对称加密算法的弱点在于协商密钥的过程采用明文不安全,存在密钥泄漏的可能,那么我们是不是可以不采用明文,而是采用非对称加密算法来协商此密钥,之后传输数据时再采用对称加密算法进行加密。
也就是说,**用非对称加密算法传输密钥,用对称加密算法传输实际数据。**此密钥一般称为『会话密钥』。

  • 会话密钥通过非对称加密算法传输,非常安全;
  • 大量数据通过对称加密算法传输(多次),会话密钥只需要传一次,非常高效!

摘要算法

摘要算法也称为哈希算法,其输入为任意数据,输出为固定长度的字符串(称为摘要)。主要特点如下:

  • 不可逆,即无法通过输出反推输入。
  • 相同的输入必会产生相同的输出。
  • 不同的输入大概率会产生不同的输出。
  • 无论输入的数据有多长,输出摘要的长度固定不变。

举个例子:如果将数据的比特流每 8 个比特进行分组(不足的补零),然后将所有分组进行按位异或运算,那么生成的结果就可以称为摘要,此算法就是一种简单的摘要算法。

在这里插入图片描述

如果两个输入数据经过摘要算法得到的输出摘要一致,则称为出现了哈希碰撞。一个好的摘要算法出现哈希碰撞的概率非常低,而且非常难以通过输出猜测输入的内容!
计算机网络中常用的摘要算法有:MD5、SHA-1、SHA-256 等。

在这里插入图片描述

为了防止传输数据被黑客所篡改,发送方除了发送实际数据外,还利用摘要算法得到数据的一个摘要,并将此摘要一并发送。
接收方收到数据后,利用同样的摘要算法再次得到数据的摘要,并将其与发送方发送的摘要进行比对校验,如果二者不一致,则说明数据被篡改了,反之则没有。

在这里插入图片描述

小伙伴们很容易看出来上述方式存在明显缺陷,如果黑客不仅篡改了数据,而且同时篡改了摘要,接收方不就无法判断数据是否被篡改了吗?

在这里插入图片描述

为了防止这种情况的发生,发送方与接收方必须有一个只有二者知道的,而黑客不能知道的东西,比如对称加密的会话密钥。不过为了提升安全性,此时一般不使用会话密钥,而是使用一个新的密钥,称之为鉴别密钥,这个密钥的获取同会话密钥。
有了鉴别密钥后,摘要算法的输入就不仅仅是传输数据了,而是传输数据和鉴别密钥!黑客由于不知道鉴别密钥,就无法再伪造输入,篡改的摘要也就不正确了,从而保证了安全性!

在这里插入图片描述

数据和鉴别密钥级联后经过摘要算法所生成的摘要有个专用名字,称为报文鉴别码,简称 MAC
为了进一步提升安全性,实际上客户端和服务器将使用不同的会话密钥和鉴别密钥,也就是一共需要四个密钥:

  1. 用于从客户端发送到服务器的数据的会话密钥;
  2. 用于从服务器发送到客户端的数据的会话密钥;
  3. 用于从客户端发送到服务器的数据的鉴别密钥;
  4. 用于从服务器发送到客户端的数据的鉴别密钥。

数字证书

前面提到 HTTPS 采用非对称加密算法传输会话密钥。一般是服务器将公钥对外公布,客户端利用此公钥加密会话密钥,然后服务器通过私钥解密得到会话密钥,此时双方即协商好了用于对称加密传输数据的密钥。
但是万一服务器的公钥是被黑客伪造的呢?比如经典的『中间人攻击』问题:

  1. 客户端发送的请求被中间人(黑客)劫持(如使用 DNS 劫持),所有请求均发送至中间人。
  2. 中间人假装自己是正规网站(服务器),向客户端返回自己的公钥 2 ,并索要正规网站的公钥 1。
  3. 客户端使用中间人的公钥 2 加密会话密钥1,并发送至中间人。
  4. 中间人使用自己的私钥 2 解密得到会话密钥1,同时假装自己是客户端,使用正规网站的公钥 1 加密会话密钥2(可以与会话密钥 1 相同)并发送至正规网站。
  5. 客户端使用会话密钥1对数据进行加密,并发送至中间人。
  6. 中间人使用会话密钥1对数据进行解密,得到明文数据!(实现了窃听)
  7. 中间人使用会话密钥2对数据(可能是篡改的)进行加密,并发送至正规网站。

此时,客户端与服务器的通信再无安全性可言!中间人不仅能够窃听到消息内容,还能够进行篡改!
在这里插入图片描述

客户端如何知道自己所拥有的公钥是来自于正规网站而不是中间人呢?这时候就需要数字证书了!
数字证书的概念就像是我们的身份证一样,专门用于验证通信实体的身份。咱们的身份证是去派出所申请的,而数字证书则需要向认证中心(Certification Authority,CA)申请,而且是需要收费的!
通过数字证书解决中间人攻击的具体过程为:

  • 服务器(正规网站)首先生成一对公钥和私钥,然后将域名、申请者、公钥(注意不是私钥,私钥是无论如何也不能泄露的)等信息整合在一起,生成 .csr 文件,并将此文件发给认证中心 CA。
  • CA 收到申请后,会通过各种手段验证申请者的信息,如无异常,则使用摘要算法得到 .csr 中明文信息的一个摘要,再用 CA 自己的私钥对这个摘要进行加密,生成一串密文,密文也称为数字签名。数字证书即包含此数字签名和 .csr 中明文信息。CA 把这个证书返回给申请人。
  • 为了防止中间人攻击,客户端要求服务器发送其证书,并进行验证。
  • 客户端在验证证书时,把证书里的签名与及明文信息分别取出来,然后会**用自身携带的 CA 机构的公钥去解密签名,得到摘要 1,再利用摘要算法得到明文信息的摘要 2,对比摘要 1 和摘要 2,如果一样,说明证书是合法的,也就是证书里的公钥是正确的,否则说明证书不合法。 **

在这里插入图片描述

浏览器如何得到认证中心的公钥呢?万一此公钥是被伪造的呢?为了防止套娃,实际电脑操作系统中会内置这些认证中心的公钥!因而无需担心认证中心公钥被伪造的问题。
Chrome 浏览器一旦发现一个网站数字证书无效,就会生成如下界面进行提示,如果用户强制访问,则存在一定的风险。

在这里插入图片描述

SSL/TLS 握手

根据前面所述,进行一下小结:

  • HTTPS 通过混合加密算法解决 HTTP 传输数据容易被窃听的问题,此过程需要协商会话密钥。
  • HTTPS 通过摘要算法解决 HTTP 传输数据容易被篡改的问题,此过程需要协商鉴别密钥。
  • HTTPS 通过数字证书解决 HTTP 协议中身份容易被伪造的问题,此过程需要客户端验证服务器的证书。

那么 HTTPS 具体是怎么做的呢?通信双方在什么时候协商会话密钥和鉴别密钥、什么时候验证证书合法性的呢?答案是 SSL/TLS 协议握手的时候。
HTTPS 比 HTTP 多的那个『S』就是指 SSL/TLS 协议。

在这里插入图片描述

在 HTTPS 协议中,当客户端与服务器通过三次握手建立 TCP 连接之后,并不会直接传输数据,而是先会经过一个 SSL/TLS 握手的过程,用于协商会话密钥、鉴别密钥以及验证证书等,之后就可以安全传输数据了!
在这里插入图片描述

下面通过 Wireshark 抓包,具体讲一下 SSL/TLS 1.2 四次握手的过程。
在这里插入图片描述

第一次握手
客户端向服务器发起加密通信请求 ,内容主要包括:

  1. 客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
  2. 客户端生产的随机数 1,用于后续生成会话密钥和鉴别密钥。
  3. 客户端支持的密码套件列表,每个密码套件包含:
    1. 用于传输会话密钥的非对称加密算法,如 ECDHE、RSA;
    2. 用于验证数字证书的非对称加密算法,如 ECDHE、RSA;
    3. 用于传输数据的对称加密算法,如 AES_128_GCM、AES_128_CBC;
    4. 用于验证报文完整性的摘要算法,如 SHA256、SHA384;
    5. 格式为:TLS_非对称加密算法_非对称加密算法_对称加密算法_摘要算法,如果两个非对称加密算法一致,可省略不写。

在这里插入图片描述

第二次握手
服务器收到客户端加密通信请求后,向客户端发出响应,内容主要包括:

  1. 确认的 SSL/ TLS 协议版本,如果双方支持的版本不同,则关闭加密通信。
  2. 服务器生产的随机数 2,用于后续生成会话密钥和鉴别密钥。
  3. 确认的密码套件,如 TLS_RSA_WITH_AES128_CBC_SHA。
  4. 服务器的数字证书。

在这里插入图片描述

第三次握手
客户端收到服务器的回应之后,会验证其数字证书是否合法(验证方法在数字证书小节中有说明),如果证书合法,则进行第三次握手,内容主要包括:

  1. 客户端生产的另一个随机数 3(称为前主密钥,Pre-Master Secret,简写为 PMS),此随机数会被服务器公钥加密。客户端根据随机数 1、随机数 2 以及前主密钥计算出主密钥(Master Secret,MS),接着将主密钥切片得到两个会话密钥和两个鉴别密钥。
  2. 加密通信算法改变通知,表示之后数据都将用会话密钥进行加密。
  3. 客户端握手结束通知,表示客户端的握手阶段已经结束。客户端会生成所有握手报文数据的摘要,并用会话密钥加密后发送给服务器,用来供服务端校验。

在这里插入图片描述

第四次握手
服务器收到客户端的消息后,利用自己的私钥解密出前主密钥,并根据随机数 1、随机数 2 以及前主密钥计算出主密钥,接着将主密钥切片得到两个会话密钥和两个鉴别密钥。
之后进行第四次握手,内容主要包括:

  1. 加密通信算法改变通知,表示之后数据都将用会话密钥进行加密。
  2. 服务器握手结束通知,表示服务器的握手阶段已经结束。服务器会生成所有握手报文数据的摘要,并用会话密钥加密后发送给客户端,用来供客户端校验。

在这里插入图片描述

至此,整个 SSL/TLS 的握手阶段全部结束!
为什么第三、第四次握手要发送所有握手报文的摘要呢?
主要原因是防止握手信息被篡改。比如客户端支持的密码套件列表中,有些加密算法较弱,有些加密算法较强,而此密码套件是明文传输的,万一黑客将此密码套件列表进行了修改,只留下一些安全性较低的加密算法,那么服务器就只能从这些安全性较低的加密算法中选择,安全性大大降低。因此需要通过发送摘要的形式防止握手信息被篡改。
为什么不直接发送一个主密钥,而是用两个随机数加一个前主密钥重新生成一个主密钥呢?
主要原因是防止连接重放。如果没有前面两个随机数,仅仅由客户端生成一个主密钥,并通过服务器公钥加密发送给服务器。那么黑客在嗅探了服务器与客户端之间的所有报文后,可以再次冒充客户端向服务器发送相同的报文(虽然黑客不知道内容是什么),因为报文信息都是之前客户端和服务器验证过的,因此服务器会认为是客户端与其通信,导致又一次连接。
假如服务器是一个购物网站,那么此连接重放会导致客户端再一次下单,造成损失。
而如果有了前两个随机数,即使黑客冒充客户端想要连接重放,然而由于随机数不同,生成的密钥则不同,黑客重新发送的内容将失效(服务器不能理解、完整性摘要也不对)。
最后,用一张图总结 TLS 四次握手的过程。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/2314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++11智能指针

目录 一、智能指针的初步认识 1.1 使用场景 1.2 原理 二、std::auto_ptr 2.1 管理权转移 2.2 auto_ptr的模拟实现 三、std::unique_ptr 四、std::shared_ptr 4.1 基础设计 4.2 线程安全问题 4.3 定制删除器 五、std::weak_ptr 六、C11与Boost中智能指针的关系 一、…

脱不下孔乙己的长衫,现代的年轻人该怎么办?

“如果我没读过书,我还可以做别的工作,可我偏偏读过书” “学历本该是我的敲门砖,却成了我脱不下的长衫。” 最近,“脱下孔乙己的长衫”在网上火了。在鲁迅的原著小说中,孔乙己属于知识阶级(长衫客&#xf…

网络安全工具大合集

还是一句话,功夫再高,也怕菜刀首先,恭喜你发现了宝藏。本文章集成了全网优秀的开源攻防武器项目,包含:信息收集工具(自动化利用工具、资产发现工具、目录扫描工具、子域名收集工具、指纹识别工具、端口扫描…

Json数据传递参数

文章目录Json数据传递参数集合参数:Json格式POJO参数:json格式集合参数:json格式RequestBody与RequestParam的区别时间参数的转换Json数据传递参数 第一步 在pom文件中添加相关配置第二步 作用时开启json数据转换成对象postman发送json数据…

CSS 实现六边形柱状图

前言 👏CSS 实现六边形柱状图 速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义全局css变量,柱状宽度为–w,最大高度为–h,柱形整体为渐变色,定义上部分颜色为…

【STL三】序列容器——array容器

【STL三】序列容器——array一、array简介二、头文件三、模板类四、成员函数1、迭代器2、元素访问3、容量4、操作五、demo1、容量(不使用迭代器)2、使用迭代器3、元素访问 at()、front()、back()、data()一、array简介 array 容器是 C 11 标准中新增的序…

ChatGPT能否取代程序员?

目录ChatGPT能否取代程序员?ChatGPT和程序员的工作内容和工作方式ChatGPT和程序员的共同点程序员的优势程序员的实力ChatGPT和程序员的关系结论惊喜ChatGPT能否取代程序员? ChatGPT是一种非常普遍的人工智能(AI)系统,…

基于springboot家政服务管理系统(程序+数据库+文档)

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

基于java+SpringBoot+Vue的论坛管理系统设计与实现【源码(完整源码请私聊)+论文+演示视频+包运行成功】

博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(200套) 目录 一、效果演示 二、…

MyBatis --- 缓存、逆向工程、分页插件

一、MyBatis的缓存 1.1、MyBatis的一级缓存 一级缓存是SqlSession级别的,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就会从缓存中直接获取,不会从数据库重新访问 使一级缓存失效的四种情况: 1、…

Python生日蛋糕

目录 前言 底盘 蛋糕 蜡烛 祝福 前言 Hello,小伙伴们晚上好吖!前两天博主满20岁啦(要开始奔三辽呜呜呜),这几天收到了不少小伙伴们的祝福,浪漫的小博主想送给大家一份不一样的生日蛋糕&#xff0c…

【Linux】学会这些基本指令来上手Linux吧

前言上篇文章介绍了一些常用的指令,这篇文章再来介绍一下Linux必须学会的指令。一.时间相关的指令ate显示date 指定格式显示时间: date %Y:%m:%d date 用法:date [OPTION]... [FORMAT]1.在显示方面,使用者可以设定欲显示的格式&am…

2023最全最牛的Jmeter接口测试教程及接口测试详情,你不知道的东西太多了!

下边是详细的jmeter接口测试入门到精通的详细教程,还有视频版本教您实战操作! 2023年B站最新Jmeter接口测试实战教程,精通接口自动化测试只需要这一套视频_哔哩哔哩_bilibili2023年B站最新Jmeter接口测试实战教程,精通接口自动化…

算法套路四——反转链表

算法套路四——反转链表 算法示例一:LeetCode206. 反转链表 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 初始化pre为空,cur为头指针 pre指针:记录当前结点的前一个结点 cur指针:记录当…

SpringBoot整合MongoDB

参考链接 https://www.mongodb.org.cn/ 文章目录一、前言1.1 NoSQL介绍1.1.1 NoSQL 数据库分类1.1.2 NoSQL的优点/缺点1.1.3 BASE1.2 MongoDB介绍1.2.1 MongoDB和SQL对比1.2.2 数据库1.2.3 元数据1.2.4 MongoDB 数据类型二、SpringBoot整合MongDB2.1 环境配置2.2 MongoTemplate…

XCPC第十一站,带你学会图论基本算法

我们约定:以下n表示点的数目,m表示边的数目。 引子1——邻接表存储图的方法()(暂时不考虑重边和自环) 现在我们有n个点(编号为1~n)和m条边,要用数组存储它们&#xff0c…

大数据模型、离线架构、实时架构

一.大数据模型 8种常见的大数据分析模型:1、留存分析模型;2、漏斗分析模型;3、全行为路径分析;4、热图分析模型;5、事件分析模型;6、用户分群模型;7、用户分析模型;8、黏性分析模型…

10 个超赞的 C 语言开源项目

今天给大家分享10个超赞的C语言开源项目,希望这些内容能对大家有所帮助!01.WebbenchWebbench是一个在 Linux 下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能。最多可以模拟 3…

Mysql 时区差8小时的多种问题 统统解决

笑小枫专属目录背景知识点代码中常见的三种时间差错问题【我遇到的】本地获取的时间没有错,存入数据库的时候时间相差8小时java下使用 new date()获取的时间会和真实的本地时间相差8小时数据库时间没有错,获取到了后端,之后返回给前端相差8小…

Android 不申请权限储存、删除相册图片

Android 不申请权限储存、删除相册图片 前言 最近重新看了下安卓的储存适配,并结合之前做的拍照、裁切demo,小小实验了一下。Android 6.0增加了动态文件权限申请; Android 7.0需要使用FileProvider来获取Uri,不能直接使用file获得; Android…