HTTP协议
如果说TCP/IP五层协议在面试中的重要性是10分,那么它在java开发中的重要性便只有6分.而HTTP协议在面试和开发的重要性都是10分.
HTTP是我们日常开发中非常常用的协议,无论是你的浏览器,还是手机app,都会或多或少的接触到HTTP,它的默认端口是80
安装抓包工具
要想最好的了解HTTP,我们得使用一个抓包工具,来对HTTP进行抓包学习.我使用的工具是Fiddler,下载链接
bash
https://downloads.getfiddler.com/fiddler-classic/FiddlerSetup.5.0.20253.3311-latest.exe
进行第一次抓包
打开软件后,我们会发现软件左边会跳出很多HTTP/HTTPS的链接记录(fiddler是专门抓包HTTP/HTTPS的工具)
我们先打开浏览器,访问百度网站,访问完后在fiddler中找到该条记录

双击该记录后,右边就是抓包内容
我们先在右侧将抓包内容转化为原始格式,即RAW

我在这把原文内容粘贴下来
text
GET https://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
sec-ch-ua: "Chromium";v="148", "Microsoft Edge";v="148", "Not/A)Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: BAIDUID=5AD75290820E2A40F72E8402507FD090:FG=1; BAIDUID_BFESS=5AD75290820E2A40F72E8402507FD090:FG=1
能注意到这里面都是都是由一行行字符组成的.实际上这些内容,就是一个完整的HTTP请求.如果通过前面学习的TCP socket把这些内容发送到过去,就相当于发送一个HTTP请求了.因此HTTP协议就是按照特定格式发送一段字符串而已
另外我们可以注意到在请求报文下方的响应有一段是乱码

这样的乱码看起来有没有感觉熟悉?像不像你用记事本来打开一个二进制文件的样子?
既然这响应看起来这么像二进制文件,那么HTTP的响应带有二进制文件吗?
实则不然,看起来是乱码的原因是由于HTTP为了节省带宽,对响应的部分数据进行压缩了,我们直接看到的就是压缩的内容(即像二进制文件的乱码)
注意到图片上面有一个有一个Click to decode(点击解码)没?如果我们点一下就会发现乱码消失了,变成正常字符串了

具体内容我就不全部放出来了,有2000行呢.由此也可见压缩的能力强大,通过文本打开看着也就3行的乱码,解码出来变成了2000行
解析抓包内容
对于上段请求内容,我们会发现除了第一行,每一行都有一个特点:前面是一段标签,标签后面加上一个冒号和空格,剩下的就是标签内容.这个像Map一样的结构就是键值对
第一行很特殊.GET https://www.baidu.com/ HTTP/1.1中GET表示这条请求属于GET请求(后面会具体解析GET请求是什么),后面的HTTP/1.1表示是使用的HTTP协议版本是1.1(截止写稿日,HTTP的最新版本是3)
其它内容都属于请求头(header)
在请求头后会有一个专门的空行 :正文的结束标志.再下面的内容就是正文(body)了.对于请求来说,是可以没有正文的,示例的这个请求就是没有正文.
对于这些请求头,想了解的可以看下面ai解析,我们后面也会对其进行具体解析
HTTP 请求头详细解析:百度首页 (Baidu.com)
这段信息是一个标准的 HTTP GET 请求头(Request Headers) ,通常出现在 Fiddler、Charles 或浏览器开发者工具的网络面板中。它描述了客户端(Windows 上的 Edge/Chrome)向服务器(www.baidu.com)发起请求时的"自我介绍"和"偏好设置"。
以下是逐行详细的技术解析:
1. 基础连接信息
| 字段 | 值 | 含义 |
|---|---|---|
| Method | GET |
客户端想要获取该 URL 对应的资源(通常是 HTML 页面)。 |
| URL | https://www.baidu.com/ |
目标地址,使用 HTTPS 加密传输。 |
| Protocol | HTTP/1.1 |
使用的 HTTP 协议版本。 |
| Host | www.baidu.com |
告诉服务器你要访问的具体域名(虚拟主机标识)。 |
| Connection | keep-alive |
保持 TCP 连接打开,以便后续请求复用同一个连接,减少握手延迟。 |
2. 浏览器身份与指纹 (Identity)
这部分是服务器用来识别"你是谁"的关键信息:
User-Agent: Mozilla/5.0 ... Edg/148.0.0.0- 经典的浏览器标识符,告诉服务器这是 Microsoft Edge 浏览器(基于 Chromium 内核),运行在 Windows 10 系统上,版本为 148。
sec-ch-ua...- Chrome/Edge 浏览器特有的头部,用于更精细地描述 User-Agent 字符串。
"Chromium";v="148": 内核版本。"Microsoft Edge";v="148": 具体是 Edge 浏览器。
sec-ch-ua-mobile: ?0?0表示 桌面端 (Desktop) ,如果是手机通常是?1。
sec-ch-ua-platform: "Windows"- 操作系统是 Windows。
3. 隐私与安全设置 (Privacy & Security)
DNT: 1- Do Not Track : 值为
1表示用户开启了"请勿追踪"功能,希望减少被第三方广告商跟踪。
- Do Not Track : 值为
Upgrade-Insecure-Requests: 1- 如果 URL 是 HTTP,服务器会尝试返回 HTTPS 版本;这里 URL 已经是 HTTPS,所以主要是兼容性提示。
4. 内容协商偏好 (Content Negotiation)
告诉服务器:"你能给我发什么格式的数据?"
Accept: text/html...- 客户端主要想要
text/html,但也支持 XML、图片等。优先级最高的是 HTML。
- 客户端主要想要
Accept-Encoding: gzip, deflate, br, zstd- 表示客户端支持多种压缩算法(gzip, brotli (
br) 等)。服务器通常会选择br(Brotli) 或gzip来减小传输体积,节省流量和时间。
- 表示客户端支持多种压缩算法(gzip, brotli (
Accept-Language: zh-CN,zh;q=0.9...- 客户端首选语言是 简体中文 (
zh-CN) ,其次是其他英语变体。服务器会根据这个返回对应语言的网页内容(如Content-Language)。
- 客户端首选语言是 简体中文 (
5. 导航上下文 (Navigation Context)
这是现代浏览器(Chrome/Edge)新增的头部,帮助服务器判断请求的来源:
Sec-Fetch-Site: nonenone: 表示这是一个 顶级站点 的直接访问(例如直接在地址栏输入 baidu.com),而不是从baidu.com/blog等子域名跳转过来的。
Sec-Fetch-Mode: navigate- 表示这是通过
<a>标签或地址栏进行的正常页面导航,而不是 AJAX (fetch) 或 iframe。
- 表示这是通过
Sec-Fetch-Dest: document- 期望返回的内容类型是 HTML 文档(即整个网页)。
6. 会话与追踪 (Session & Tracking)
Cookie: BAIDUID=...; BAIDUID_BFESS=...- 这是服务器之前发给客户端的,现在客户端回传给服务器。
BAIDUID: Baidu 的核心用户标识符(User ID),用于追踪用户在百度生态内的行为、登录状态等。BAIDUID_BFESS: 通常是加密后的会话 ID 或安全令牌,用于防止 CSRF 攻击或验证会话有效性。
📝 总结
这是一个来自 Windows 10/11 上的 Microsoft Edge (Chromium) 浏览器 ,通过 HTTPS 协议访问 百度首页 的请求。
- 来源 : 桌面端直接导航 (
Sec-Fetch-Site: none)。 - 偏好: 喜欢 HTML 格式,支持 Brotli/Gzip 压缩,首选简体中文。
- 隐私: 开启了 DNT (请勿追踪)。
- 状态 : 携带了 Baidu 特有的 Cookie(
BAIDUID),说明之前已经建立过会话或进行过 A/B 测试标记。
如果你是在 Fiddler 中看到这段,通常意味着这是一个正常的首页加载请求,除非 Cookie 中的 ID 异常(例如长度过长或被篡改),否则一般无需担心。
下面我们再来看HTTP响应(只截取了首行和响应头,正文内容太长了)
text
HTTP/1.1 200 OK
Bdpagetype: 1
Bdqid: 0xd2d0770b07698a55
Connection: keep-alive
Content-Type: text/html; charset=utf-8
Date: Sun, 31 May 2026 11:48:08 GMT
Server: BWS/1.1
Set-Cookie: BIDUPSID=5AD75290820E2A40F72E8402507FD090; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1780228088; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: H_PS_PSSID=63148_65590_67862_68166_69002_69295_69593_69673_69804_69785_69764_69911_69962_70043_70037_70117_70159_70216_70208_70290_70274_70321_70142_69924_70355_70404_70440_70465_70479_70365_70623_70688_70764_70798_70807; path=/; expires=Mon, 31-May-27 11:48:08 GMT; domain=.baidu.com
Set-Cookie: BDSVRTM=7; path=/
Set-Cookie: BD_HOME=1; path=/
Strict-Transport-Security: max-age=172800
Tr_id: super_0xd2d0770b07698a55
Traceid: 1780228088069185229815190772432373385813
X-Ua-Compatible: IE=Edge,chrome=1
X-Xss-Protection: 1;mode=block
Content-Length: 681316
正文内容省略...
对于第一行,第一个HTTP1/1表示的是使用的协议版本,第二个200表示的状态码(后面会详细解析),第三个OK是状态码描述
对于这些报文头,想了解的可以看下面ai解析,我们后面也会对其进行具体解析
省略的响应内容就是用来描述网页结构的信息(html,css,JavaScript).我们看到的百度网页就是通过这些内容描绘的
对于这些响应头,想了解的可以看下面ai解析,我们后面也会对其进行具体解析
HTTP 响应头详细解析:百度首页 (200 OK)
这段信息是一个标准的 HTTP 1.1 响应头(Response Headers) ,通常出现在 Fiddler、Charles 或浏览器开发者工具的网络面板中。它描述了服务器(www.baidu.com)成功处理客户端请求后返回的"成绩单"和"附加指令"。
以下是逐行详细的技术解析:
1. 状态与连接信息 (Status & Connection)
| 字段 | 值 | 含义 |
|---|---|---|
| Status Line | HTTP/1.1 200 OK |
表示请求成功,服务器已找到并返回了资源。 |
| Connection | keep-alive |
保持 TCP 连接打开,允许客户端在后续继续发送请求(复用连接)。 |
| Content-Type | text/html; charset=utf-8 |
响应体的 MIME 类型是 HTML,字符集为 UTF-8。 |
| Date | Sun, 31 May 2026 ... |
服务器生成响应的 UTC 时间(注意年份显示为 2026)。 |
| Content-Length | 681316 |
响应体内容的字节大小,约为 675 KB。 |
2. Cookie (会话与追踪)
这是服务器向客户端写入的 Cookie,用于维持状态和追踪用户行为:
Set-Cookie: BIDUPSID=...- 核心会话 ID: Baidu 生态系统的长期用户标识符(类似 Session ID),用于识别登录状态或注册用户。
expires: 有效期极长(2037 年),属于持久 Cookie。
Set-Cookie: PSTM=...- 时间戳会话: 通常与当前时间相关,用于短期会话验证或防重放攻击。
Set-Cookie: H_PS_PSSID=...- 广告/实验 ID 列表 : 包含了一长串数字(如
63148_65590...),通常代表当前页面加载的 A/B 测试组、个性化推荐 ID 或广告投放 Campaign ID。
- 广告/实验 ID 列表 : 包含了一长串数字(如
Set-Cookie: BDSVRTM=7- 访问计数器: 可能表示这是用户第 7 次访问该域名下的特定资源(Visit Counter)。
Set-Cookie: BD_HOME=1- 首页标识 : 标记当前请求为"首页" (
1),用于区分首页和子页面逻辑。
- 首页标识 : 标记当前请求为"首页" (
3. 安全与传输 (Security & Transport)
| 字段 | 值 | 含义 |
|---|---|---|
| Strict-Transport-Security | max-age=172800 |
HSTS: 强制客户端在未来 2 天(172800 秒)内仅通过 HTTPS 访问该域名,防止 SSL 降级攻击。 |
| X-Xss-Protection | 1;mode=block |
启用旧版浏览器的 XSS 过滤器,并在检测到跨站脚本攻击时阻断页面加载。 |
4. 服务器与内部调试 (Server & Internal Debugging)
这部分信息主要用于 Baidu 内部的日志追踪和性能分析:
Server: BWS/1.1- 表明后端 Web 服务器软件版本(Baidu Web Server)。
Tr_id/Traceid- 分布式追踪 ID: 用于在微服务架构中追踪单个请求的全链路日志。如果发生错误,可以通过这些 ID 快速定位是哪个节点处理出了问题。
Bdpagetype: 1- Baidu 内部标识,通常表示
1代表首页(Homepage)。
- Baidu 内部标识,通常表示
Bdqid: ...- Baidu Query ID:可能是特定查询或会话的唯一指纹 ID。
5. 浏览器兼容性 (Compatibility)
X-Ua-Compatible: IE=Edge,chrome=1- 告诉旧版 Internet Explorer 浏览器,即使它内核较老,也应以 Edge/Chrome 模式渲染页面,以获得更好的兼容性和性能。
📝 总结
这是一个来自 Baidu Web Server (BWS) 的 成功响应。
- 状态 :
200 OK,资源加载正常。 - 会话: 服务器成功更新了客户端的 Cookie(包括长期 ID、短期 Session、广告追踪 ID)。
- 安全: 开启了 HSTS 和 XSS 防护,强制 HTTPS 连接。
- 内部: 携带了详细的 Trace ID 用于 Baidu 内部的日志审计和性能监控。
如果你是在 Fiddler 中看到这段,通常意味着服务器已成功处理请求并返回了 HTML 页面(正文内容省略部分),且会话状态已更新。注意 Date 字段显示的年份为 2026,这可能意味着服务器系统时间被调整过,或者这是一个未来的测试环境数据。
HTTP请求中的URL
我们先学习一下URL的相关知识
在前面抓包的内容中,我们直接访问了www.baidu.com这个域名.这个域名带我们进入了百度的搜索主页.
此时,浏览器上显示的地址是https://www.baidu.com
这一段其实就是URL.https代表的是协议格式:即这段链接用的是HTTPS协议.www.baidu.com代表的是主机名
对于上面的URL,实际上是有一个特定格式的,格式内容如下
- 协议://用户名:密码@主机名:端口/路径?查询参数#锚点
英文格式-->Scheme://User:Pass@Host:Port/Path?Query#Fragment
不过这个格式跟上面的
www.baidu.com相比,好像少了些东西:路径,参数,锚点好像都没有其实这是正常的,因为在URL中,没有的就是没有,而不是像java里还得给一个null
URL参数解析
要想真正理解这个URL协议格式,肯定是要解释URL中所有的格式内容的
- 协议名(必填):访问使用的协议,比如网页浏览的http和https,还有文件传输的ftp等等
http://www.baidu.com 就是使用的http协议 - 用户名:密码(选填):用于进行身份验证.不过在日常中几乎不使用这个验证方法
http://admin:admin@127.0.0.1 使用admin账密来登录该主机 - 端口(选填):服务端口,如http协议的80端口,https协议的443端口.如果使用的就是该服务的默认端口,就可以忽略这个参数
http://admin:admin@127.0.0.1:80 与上一条示例相比就是添加了端口号 - 路径(选填):当前访问的服务器地址,当忽略该参数时就默认使用根目录 /
http://admin:admin@127.0.0.1:80/test/index.html 使用账密访问work目录中的index.html文件 - 查询参数(选填):使用键值对(k=v)来进行查询,多个查询使用
&分隔
http://admin:admin@127.0.0.1:80/test/index.html?a=b\&c=1 查询参数由开发者自定义,通常普通用户无需配置,忽略就是无查询参数 - 锚点(选填):页面内定位,只影响客户端网页中的显示位置(类似于跳转到小说中的第一章第二章),不会发送给服务器
http://admin:admin@127.0.0.1:80/test/index.html?a=b\&c=1#title
在这个搜索主页的输入框中,我们可以键入我们想搜索的内容,然后百度就会给我们对应的返回结果
那么,你是否有注意过我们在键入一个搜索内容后点击搜索时,浏览器链接的变化?

完整链接在这
https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&rsv_idx=1&tn=baidu&wd=http&fenlei=256&rsv_pq=0xbeff75a9070a6358&rsv_t=eb47au%2Fc3rigULmGj%2FfTOgVfqDQQ33fLELhkF1rytlJEhPQ2Jw%2FInxROIDOD&rqlang=en&rsv_enter=1&rsv_dl=ih_0&rsv_sug3=1&rsv_sug1=1&rsv_sug7=001&rsv_sug2=1&rsv_btype=i&rsp=0&rsv_sug9=es_2_1&rsv_sug4=1069&rsv_sug=1
umm,是不是跟想象中的有点不一样?我们仅仅只是在百度搜索中搜索了一个http,为什么链接变成了这么复杂的一串?
如果细细观察,会发现里面都是各种各样的查询参数参数.比如我们搜索的http,在这个链接中就是用参数wd=http来表示的.剩下的其它参数都是百度这个页面自动帮我们提交的各种各样莫名其妙的参数
比如rsv_enter=1,这个代表用的是回车搜索,为0表示鼠标点击搜索.还有rsv_sug4=1069,这个代表输入耗时,即我输入thhp用了1069ms...还有各种各样莫名其妙的参数就不一一列举了
前面我们说了,URL中的参数是由程序员自定义的,因此通常不同的网页,都有不同的URL格式.我们可以在搜狗中也搜索一次http看看

https://www.sogou.com/web?query=http&_asf=www.sogou.com&_ast=&w=01019900&p=40040100&ie=utf8&from=index-nologin&s_from=index&sourceid=9_01_03&sessiontime=1780541987720
相较于百度的链接,搜狗这个简短一些,少了很多莫名其妙的参数
但你有没有想过,如果我们搜索的不是英文,而是中文,那么这个链接中的参数也会变成中文吗?我们可以试试把搜索内容替换为HTTP协议,再来看看链接是不是像我们想象中的那样有中文

看来确实跟我们猜测一样...
吗?
如果我们把这个链接复制下来再看
https://www.sogou.com/web?query=http%E5%8D%8F%E8%AE%AE&_ast=1780541988&_asf=www.sogou.com&w=01029901&p=40040100&dp=1&cid=&s_from=result_up&sourceid=5_01_03&sessiontime=1780542306212
发现没?原本query=http协议复制链接下来变成了query=http%E5%8D%8F%E8%AE%AE
为什么?因为URL中有一个机制叫做 URL encode
URL encode
所谓URL encode ,实际上就是在表现中文字符时,用特定编码转义而已
如果我们使用一些在线工具,会发现这段代码代表的含义正是原本浏览器上显示的http协议

这个从中文到一个特定字符串的过程就叫做URL encode(URL编码).与之相对,把一个特定字符串转到中文就叫做URL decode(URL解码)
- 为什么浏览器显示的是中文?
因为现代浏览器太高级了,会自动将链接中的特定编码进行解码
HTTP的请求方法
前面抓包能看到第一行内容中第一个单词是GET.这个GET就是HTTP访问的一个请求方法
对于HTTP有很多请求方法,但是绝大部分我们只使用其中的一两个方法
| 方法 | 作用 |
|---|---|
| GET | 获取资源 |
| POST | 传输实体主题 |
| PUT | 传输文件 |
还有不常用方法HEAD,EDLETE,OPTIONS等,不进行示例
GET
GET方法一定是最常用的方法,没有之一
前面我们说过,对于GET请求,通常那个是不带body的.不过这个不带body属于规定而不是规则.就像农夫山泉建议零售价两元,但仍然会有小卖部卖三元一样.因此如果想的话,GET也能有body
那为什么很多请求没有使用body呢?如果需要传一个照片,我们可以把照片通过base64编码转换为一段字符串,然后再把这个字符串放到GET的参数中...你就会发现使用GET请求也能传输文件了
前面我们抓包内容就是GET请求,故不在此重复粘贴
- 特殊情况
- 通过GET请求登录
对于下面这种页内登录,使用的就是GET方法来进行登录

下面是使用Basic Auth弹窗登录验证的请求抓包
GET http://8.148.148.198:7500/static/ HTTP/1.1 Host: 8.148.148.198:7500 Connection: keep-alive Cache-Control: max-age=0 Authorization: Basic bWlhb3lpOm1pYW95aQ== DNT: 1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9
可以注意到开头并非POST.这也说明GET可以用来处理登录请求
或许你会好奇,那登录的账号密码呢?
在这一栏:Authorization: Basic bWlhb3lpOm1pYW95aQ==
Basic后面的就是登录的账号密码,只不过这个账号密码被base64编码了,我们只要使用base64解码就可以得到原内容,miaoyi:miaoyi
- 通过GET传输文件
由于我没抓这种请求包,故只在此说原理
前面提到了base64,通过这个我们可以将一个图片编码成一段字符串,既然是字符串了,就能把这个字符串放在参数内,通过GET来发送图片.接收方只需要解码就会获取到原图片.其余的音视频文件都是一个道理
POST
如果说GET方法占据了HTTP中8成的请求,那么POST就可以占据HTTP1成的请求,剩下1成是其它所有格式的总和
POST请求现在主要用于两件事:1登录,2上传文件
- 登录
这是我课程作业提交系统https://www.efuzz.me:3443,当我们点击登录后,客户端就会向服务器发送一个POST请求
text
POST https://www.efuzz.me:3443/login.php HTTP/1.1
Host: www.efuzz.me:3443
Connection: keep-alive
Content-Length: 38
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="148", "Microsoft Edge";v="148", "Not/A)Brand";v="99"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
DNT: 1
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0
Origin: https://www.efuzz.me:3443
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: https://www.efuzz.me:3443/login.php
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
Cookie: PHPSESSID=f96266e296e08bdd9244e85a9f24e959; sl-session=zecxbDW3I2rGveFxn+fHhw==
identifier=2024315010204&password=1234
对于POST请求,它会将提交的账号密码保存在响应正文(body)中.也就是一行空格的下面
- 传输图片
虽然GET能通过base64编码来传输图片,但这也算是某种邪修了,正经传输文件还是用的POST请求
GET 和 POST 区别
先说结论:没有本质区别 ,最大的区别在使用习惯上
在前面示例就可以发现,无论是登录还是传输文件,POST能做的这些GET都能做.非要说区别就是下面两点
- 语义区别
GET(获取):指从服务器获取数据
POST(投递):指向服务器发送数据 - 数据传递位置
GET:传输的数据都放在URL的参数中
POST:传输的数据放在body中(POST也能将参数放在URL参数中) - 幂等性
GET:一般具有幂等性
POST:一般不具有幂等性
幂等性指输入相同的输出只会得到相同的结果.函数就是幂等的,你给函数多个相同指定值,它返回的多个结果都是相同的;大语言模型是非幂等的,你给它发送多次'你好',它给你的响应都是不同的
Restful
restful是一种设计风范,它约定了每一个请求应该用于做什么.这样可以让前后端交互更简洁统一
对于HTTP请求方法,Restful是这样定义的:
- 增删改查
- 使用GET实现查询
- 使用POST实现新增
- 使用PUT实现修改
- 使用DELETE实现删除
在此我并不具体说明,只需要知道这几个常见的请求规范即可
报头中的键值对
前面我们抓包没有对抓包的报头内容进行解析,只简单介绍了一下,在此将重点介绍常用的键值对
- Host
表示服务器的地址和端口
使用域名则通过DNS解析为对应的地址和端口
-
Content-Length
表示body中的数据长度 -
Content-Type
表示body中的数据格式
数据格式有以下几种- application/x-www-form-urlencoded
以form表单提交的数据格式
示例:name=zhangsan&age=18&gender=male - multipart/form-data:form
以form表单提交的数据格式(支持二进制文件:如图片,文件)
示例:
text------Boundary123456 Content-Disposition: form-data; name="uid" 10086 ------Boundary123456 Content-Disposition: form-data; name="avatar"; filename="head.jpg" Content-Type: image/jpeg [二进制文件流] ------Boundary123456--- application/json
json格式的数据
示例:{"name":"tom","age":20,"isAdmin":false}
- application/x-www-form-urlencoded
-
User-Agent(UA)
表示浏览器的操作属性
示例:User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0
其中,各项数据的含义如下:- Mozilla/5.0:历史遗留,无意义,保存下来只做兼容
- Windows NT 10.0:操作系统为windows10/11
- Win64;x64:64位系统
- AppleWebKit/537.36 (KHTML, like Gecko) Chrome/148.0.0.0 Safari/537.36 Edg/148.0.0.0:浏览器信息,当前浏览器是Edge,版本148(其它信息均历史遗留)
具体历史遗留可以看下面这个帖子:
User-Agent 的故事: http://www.nowamagic.net/librarys/veda/detail/2576
-
Referer
表示这个页面是从哪个页面跳转来的
如果我们直接在浏览器中输入URL,是没有Referer的.只有在网页中点击别的链接才会有这个信息
示例:Referer: https://www.baidu.com/
示例表示的就是当前链接是通过百度跳转进来的 -
Cookie
Cookie英文直译为曲奇饼,因此有网页小饼干之称.但在HTTP中,Cookie的意思翻译为缓存更加便于理解
通过Cookie,你访问的网页知道你是谁(不用每次访问都要重新登录),也知道你的喜好(喜欢夜间模式浏览网页)
那么Cookie是怎么来的呢?
当我们第一次访问一个网站时,网站发现没有Cookie就会专门在响应中带上Set-Cookie键值对
text
Set-Cookie: BAIDUID=26D392A445C86393D0918500C288E1BF:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1781183991; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=26D392A445C863938155BB9645F41CBE:FG=1; max-age=31536000; expires=Fri, 11-Jun-27 13:19:51 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Set-Cookie: BDSVRTM=5; path=/
Set-Cookie: BD_HOME=1; path=/
通过浏览器查询当前网页的Cookie,发现这个值是能对应上第一个Set-Cookie的

可以发现,Cookie的内容也只是各式各样的键值对(BAIDUID,max-age的对应值等等).而当我们继续访问这个站点时,都会带着这个Cookie进行访问
既然每次访问还要把这个Cookie给发回服务器,那服务器为什么还要发给你然后又让你发回去呢?
实际上服务器不可能只为你一个人访问,对于几十上百个请求,服务器只能通过发送一个唯一的"身份证"来确认每一个访问都是谁.就类似于高考的准考证,监考老师确认你是不是你,不是看是不是真的认识你,而是看你的遵考证信息是不是你,是不是在这个教师考试.
也正因如此,Cookie都是存储在你本地浏览器上,如果你换一个电脑,或者换一个浏览器.由于没有之前保存的Cookie,故还会让你重新登录一遍.理论上来说,如果你能将自己的Cookie拷贝到另一个浏览器,那么这个浏览器可能就不需要再登录一遍了
服务端 客户端 服务端 客户端 #mermaid-svg-nXGFEPJHINp8t4FS{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-nXGFEPJHINp8t4FS .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-nXGFEPJHINp8t4FS .error-icon{fill:#552222;}#mermaid-svg-nXGFEPJHINp8t4FS .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-nXGFEPJHINp8t4FS .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-nXGFEPJHINp8t4FS .marker{fill:#333333;stroke:#333333;}#mermaid-svg-nXGFEPJHINp8t4FS .marker.cross{stroke:#333333;}#mermaid-svg-nXGFEPJHINp8t4FS svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-nXGFEPJHINp8t4FS p{margin:0;}#mermaid-svg-nXGFEPJHINp8t4FS .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nXGFEPJHINp8t4FS text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-nXGFEPJHINp8t4FS .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nXGFEPJHINp8t4FS .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-nXGFEPJHINp8t4FS .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-nXGFEPJHINp8t4FS .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-nXGFEPJHINp8t4FS #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-nXGFEPJHINp8t4FS .sequenceNumber{fill:white;}#mermaid-svg-nXGFEPJHINp8t4FS #sequencenumber{fill:#333;}#mermaid-svg-nXGFEPJHINp8t4FS #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-nXGFEPJHINp8t4FS .messageText{fill:#333;stroke:none;}#mermaid-svg-nXGFEPJHINp8t4FS .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nXGFEPJHINp8t4FS .labelText,#mermaid-svg-nXGFEPJHINp8t4FS .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-nXGFEPJHINp8t4FS .loopText,#mermaid-svg-nXGFEPJHINp8t4FS .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-nXGFEPJHINp8t4FS .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-nXGFEPJHINp8t4FS .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-nXGFEPJHINp8t4FS .noteText,#mermaid-svg-nXGFEPJHINp8t4FS .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-nXGFEPJHINp8t4FS .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nXGFEPJHINp8t4FS .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nXGFEPJHINp8t4FS .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-nXGFEPJHINp8t4FS .actorPopupMenu{position:absolute;}#mermaid-svg-nXGFEPJHINp8t4FS .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-nXGFEPJHINp8t4FS .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-nXGFEPJHINp8t4FS .actor-man circle,#mermaid-svg-nXGFEPJHINp8t4FS line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-nXGFEPJHINp8t4FS :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 第二次访问 第一次访问,没有Cookie 由于没有Cookie,响应登录页面 登录请求 登录成功,生成Cookie并响应 第二次访问,携带Cookie 有Cookie,不用登录直接返回响应
状态码
状态码的作用就是告诉你这次请求是成功还是失败.不同的状态码对应不同的信息,其中最主要的就是可以通过状态码告诉你因为什么请求错误
状态码是由3位数字组成,分为5大类
- 1xx临时信息
请求已接受,正在处理中,类似于日志
例如:100 Continue :客户端可以继续发送剩余请求 - 2xx正常处理
请求成功,服务器正常响应
例如:200 OK :请求成功,返回正常响应 - 3xx重定向
资源位置变更,需要客户端重新在别的位置发起请求
例如:301 Moved Permanently :永久重定向,地址永久变更 - 4xx客户端错误
请求参数/权限/地址错误,问题出在客户端
例如:400 Bad Request :请求语法错误或参数不对 - 5xx服务端错误
请求没问题,问题出在服务端
例如:500 Internal Server Error :服务器内部错误
HTTP状态码有很多,但常见的就几个,下面是常见的状态码和其对应的信息
状态码|含义
-|-
200|OK:访问成功
301|Moved Permanently:永久重定向,有缓存
302|Found:重定向,无缓存
403|Forbidden:没有权限
404|Not Found:资源不存在
500|Internal Server Error:服务器内部错误
504|Gateway Timeout:响应超时
永久重定向301和重定向302的区别
301:影响浏览器缓存.当再次访问这个返回301的网站时,会跳过该网站的解析,直接访问重定向后的网站
302:不影响浏览器缓存.每次访问都会先解析返回302的网站进行重定向
重定向中响应头会有Location键值对,对应值就是重定向的目的地址
HTTPS
HTTPS = HTTP + SSL/TLS
其中SSL/TLS是一种加密组件(SSL和TLS都是用于加密的,最简单的区别就是SSL年代更加久远(且有大量严重安全漏洞,现大部分网站已禁止使用),TLS则是由SSL继任而来,后续我也都使用TLS来表示这个加密组件).因此HTTPS简单来说,就是HTTP + 加密,即加密版本的HTTP.端口号也从80变成了443
为什么要使用HTTPS?
当我们使用HTTP时,传输的所有数据都是明文,如果你的路由器被攻击,攻击者可以通过路由器知道你访问的任何一个网页,发的每一条消息,甚至提交的每一份账号密码,都会被看到
或许你会注意到在前面抓包过程中,我们也成功抓到了HTTPS的请求内容,不是说加密吗?为什么能被抓到.
实际上是由于我们的抓包软件为了能抓到并解析HTTPS的内容,在我们电脑上安装了一个证书(后面细说,现在可以理解为解密的钥匙),通过这个"钥匙",能解密出HTTPS的原文内容
使用HTTPS后,除了客户端和服务端以外,其它的机器(路由器)都不知道通信的具体内容是什么.即便通信中的数据被截取,截取方能看到的也只有一堆毫无意义的密文
那么,HTTPS是怎么利用TLS进行加密的呢?
要想理解这点,我们得知道什么是对称加密和非对称加密
对称加密和非对称加密
对称加密和非对称都属于密码学的范畴.我们只需要知道它们都是基于密码学原理而设计的加密算法
对称加密
对称加密的特点是:使用同一组密钥来进行加密解密 .
假设现在有一套加密规则:把原文中所有的字符都倒序变成密文
那么它对应的解密规则就是:把密文中所有的字符倒序变成原文
加解密过程如下:
#mermaid-svg-Frf4sIMtk7GrF8gA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Frf4sIMtk7GrF8gA .error-icon{fill:#552222;}#mermaid-svg-Frf4sIMtk7GrF8gA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Frf4sIMtk7GrF8gA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Frf4sIMtk7GrF8gA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Frf4sIMtk7GrF8gA .marker.cross{stroke:#333333;}#mermaid-svg-Frf4sIMtk7GrF8gA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Frf4sIMtk7GrF8gA p{margin:0;}#mermaid-svg-Frf4sIMtk7GrF8gA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster-label text{fill:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster-label span{color:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster-label span p{background-color:transparent;}#mermaid-svg-Frf4sIMtk7GrF8gA .label text,#mermaid-svg-Frf4sIMtk7GrF8gA span{fill:#333;color:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA .node rect,#mermaid-svg-Frf4sIMtk7GrF8gA .node circle,#mermaid-svg-Frf4sIMtk7GrF8gA .node ellipse,#mermaid-svg-Frf4sIMtk7GrF8gA .node polygon,#mermaid-svg-Frf4sIMtk7GrF8gA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Frf4sIMtk7GrF8gA .rough-node .label text,#mermaid-svg-Frf4sIMtk7GrF8gA .node .label text,#mermaid-svg-Frf4sIMtk7GrF8gA .image-shape .label,#mermaid-svg-Frf4sIMtk7GrF8gA .icon-shape .label{text-anchor:middle;}#mermaid-svg-Frf4sIMtk7GrF8gA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Frf4sIMtk7GrF8gA .rough-node .label,#mermaid-svg-Frf4sIMtk7GrF8gA .node .label,#mermaid-svg-Frf4sIMtk7GrF8gA .image-shape .label,#mermaid-svg-Frf4sIMtk7GrF8gA .icon-shape .label{text-align:center;}#mermaid-svg-Frf4sIMtk7GrF8gA .node.clickable{cursor:pointer;}#mermaid-svg-Frf4sIMtk7GrF8gA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Frf4sIMtk7GrF8gA .arrowheadPath{fill:#333333;}#mermaid-svg-Frf4sIMtk7GrF8gA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Frf4sIMtk7GrF8gA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Frf4sIMtk7GrF8gA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Frf4sIMtk7GrF8gA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Frf4sIMtk7GrF8gA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Frf4sIMtk7GrF8gA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster text{fill:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA .cluster span{color:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Frf4sIMtk7GrF8gA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Frf4sIMtk7GrF8gA rect.text{fill:none;stroke-width:0;}#mermaid-svg-Frf4sIMtk7GrF8gA .icon-shape,#mermaid-svg-Frf4sIMtk7GrF8gA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Frf4sIMtk7GrF8gA .icon-shape p,#mermaid-svg-Frf4sIMtk7GrF8gA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Frf4sIMtk7GrF8gA .icon-shape .label rect,#mermaid-svg-Frf4sIMtk7GrF8gA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Frf4sIMtk7GrF8gA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Frf4sIMtk7GrF8gA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Frf4sIMtk7GrF8gA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 使用密钥加密
使用密钥解密
我喜欢你
你喜欢我
非对称加密
非对称加密的特点是:使用两组密钥才能进行加解密
通常,由服务器存储的密钥是私钥 ,公开的密钥是公钥
用私钥加密的内容无法再用私钥解密,只能使用公钥解密.相对的,用公钥加密的内容无法再用公钥解密,只能使用私钥解密
加解密过程如下:
#mermaid-svg-FfBgdZeYg7WIJfGz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-FfBgdZeYg7WIJfGz .error-icon{fill:#552222;}#mermaid-svg-FfBgdZeYg7WIJfGz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FfBgdZeYg7WIJfGz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FfBgdZeYg7WIJfGz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FfBgdZeYg7WIJfGz .marker.cross{stroke:#333333;}#mermaid-svg-FfBgdZeYg7WIJfGz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FfBgdZeYg7WIJfGz p{margin:0;}#mermaid-svg-FfBgdZeYg7WIJfGz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster-label text{fill:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster-label span{color:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster-label span p{background-color:transparent;}#mermaid-svg-FfBgdZeYg7WIJfGz .label text,#mermaid-svg-FfBgdZeYg7WIJfGz span{fill:#333;color:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz .node rect,#mermaid-svg-FfBgdZeYg7WIJfGz .node circle,#mermaid-svg-FfBgdZeYg7WIJfGz .node ellipse,#mermaid-svg-FfBgdZeYg7WIJfGz .node polygon,#mermaid-svg-FfBgdZeYg7WIJfGz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-FfBgdZeYg7WIJfGz .rough-node .label text,#mermaid-svg-FfBgdZeYg7WIJfGz .node .label text,#mermaid-svg-FfBgdZeYg7WIJfGz .image-shape .label,#mermaid-svg-FfBgdZeYg7WIJfGz .icon-shape .label{text-anchor:middle;}#mermaid-svg-FfBgdZeYg7WIJfGz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-FfBgdZeYg7WIJfGz .rough-node .label,#mermaid-svg-FfBgdZeYg7WIJfGz .node .label,#mermaid-svg-FfBgdZeYg7WIJfGz .image-shape .label,#mermaid-svg-FfBgdZeYg7WIJfGz .icon-shape .label{text-align:center;}#mermaid-svg-FfBgdZeYg7WIJfGz .node.clickable{cursor:pointer;}#mermaid-svg-FfBgdZeYg7WIJfGz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-FfBgdZeYg7WIJfGz .arrowheadPath{fill:#333333;}#mermaid-svg-FfBgdZeYg7WIJfGz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-FfBgdZeYg7WIJfGz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-FfBgdZeYg7WIJfGz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FfBgdZeYg7WIJfGz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-FfBgdZeYg7WIJfGz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FfBgdZeYg7WIJfGz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster text{fill:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz .cluster span{color:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-FfBgdZeYg7WIJfGz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-FfBgdZeYg7WIJfGz rect.text{fill:none;stroke-width:0;}#mermaid-svg-FfBgdZeYg7WIJfGz .icon-shape,#mermaid-svg-FfBgdZeYg7WIJfGz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-FfBgdZeYg7WIJfGz .icon-shape p,#mermaid-svg-FfBgdZeYg7WIJfGz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-FfBgdZeYg7WIJfGz .icon-shape .label rect,#mermaid-svg-FfBgdZeYg7WIJfGz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-FfBgdZeYg7WIJfGz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-FfBgdZeYg7WIJfGz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-FfBgdZeYg7WIJfGz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 使用公钥加密
使用私钥解密
使用公钥无法解密
我喜欢你
公钥密文
解密失败
对于上面过程,换成先使用私钥加密情况也是一样的.我们主要得知道这两个密钥,其中一个用于加密,只有另一个密钥才能解密.在原理上,公钥和私钥是同一类东西,不存在只能公钥加密不能公钥解密的问题
部分实现TLS加密
TLS的部分实现原理就是对称加密和非对称加密,现在我们知道了对称加密和非对称加密后,就可以只有通信双方才能加解密的通信过程了.
下面是TLS的模拟过程
服务端 客户端 服务端 客户端 #mermaid-svg-1NHThRhiiurg98Im{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1NHThRhiiurg98Im .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1NHThRhiiurg98Im .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1NHThRhiiurg98Im .error-icon{fill:#552222;}#mermaid-svg-1NHThRhiiurg98Im .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1NHThRhiiurg98Im .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1NHThRhiiurg98Im .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1NHThRhiiurg98Im .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1NHThRhiiurg98Im .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1NHThRhiiurg98Im .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1NHThRhiiurg98Im .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1NHThRhiiurg98Im .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1NHThRhiiurg98Im .marker.cross{stroke:#333333;}#mermaid-svg-1NHThRhiiurg98Im svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1NHThRhiiurg98Im p{margin:0;}#mermaid-svg-1NHThRhiiurg98Im .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1NHThRhiiurg98Im text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-1NHThRhiiurg98Im .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-1NHThRhiiurg98Im .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-1NHThRhiiurg98Im .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-1NHThRhiiurg98Im .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-1NHThRhiiurg98Im #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-1NHThRhiiurg98Im .sequenceNumber{fill:white;}#mermaid-svg-1NHThRhiiurg98Im #sequencenumber{fill:#333;}#mermaid-svg-1NHThRhiiurg98Im #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-1NHThRhiiurg98Im .messageText{fill:#333;stroke:none;}#mermaid-svg-1NHThRhiiurg98Im .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1NHThRhiiurg98Im .labelText,#mermaid-svg-1NHThRhiiurg98Im .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-1NHThRhiiurg98Im .loopText,#mermaid-svg-1NHThRhiiurg98Im .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-1NHThRhiiurg98Im .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-1NHThRhiiurg98Im .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-1NHThRhiiurg98Im .noteText,#mermaid-svg-1NHThRhiiurg98Im .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-1NHThRhiiurg98Im .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1NHThRhiiurg98Im .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1NHThRhiiurg98Im .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-1NHThRhiiurg98Im .actorPopupMenu{position:absolute;}#mermaid-svg-1NHThRhiiurg98Im .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-1NHThRhiiurg98Im .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-1NHThRhiiurg98Im .actor-man circle,#mermaid-svg-1NHThRhiiurg98Im line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-1NHThRhiiurg98Im :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 以下内容为明文传输 存有:随机数1 存有:随机数1 存有:随机数1,随机数2,prKey 存有:随机数1,随机数2,puKey 生成预主密钥 存有:随机数1,随机数2,预主密钥,puKey 使用prKey解密得预主密钥 存有:随机数1,随机数2,预主密钥,prKey 客户端和服务端有相同的随机数1,随机数2和预主密钥,因此它们能生成同一个对称密钥,即会话密钥 之后内容都为密文传输 申请建立TLS连接:这是我使用的TLS版本,加密套件和随机数1 确认建立TLS连接:确认TLS版本,加密套件和随机数2 发送服务器的公钥puKey,服务器内有对应私钥prKey 使用服务器的puKey将随机数3(预主密钥)进行加密并发送
对于上面过程,假如有恶意网关(路由器)获取了客户端和服务端的通信记录,那么该网关也会因为缺少一个最重要的预主密钥导致无法生成对应的会话密钥而不能解密密文.于是通信安全得到了保证...
吗?
中间人攻击
中间人攻击是指通信双发中都经过同一个设备转发,而这个设备可以修改部分发送和接受的数据,让客户端和服务端都以为它们在互相通信,实际上是客户端和中间人通信,中间人再和服务端通信
这样后果就是中间人也会知道客户端和服务端的加密过程,本来是客户端和服务端才有的会话密钥也被中间人获取到了
如果服务端到客户端之间的某个路由器被恶意黑客植入了后门,那么通信过程会变成下面这样
服务端 恶意网关 (路由器) 客户端 服务端 恶意网关 (路由器) 客户端 #mermaid-svg-V3Wp4YGPqUXG1LiQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .error-icon{fill:#552222;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .marker.cross{stroke:#333333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-V3Wp4YGPqUXG1LiQ p{margin:0;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-V3Wp4YGPqUXG1LiQ text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-V3Wp4YGPqUXG1LiQ .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .sequenceNumber{fill:white;}#mermaid-svg-V3Wp4YGPqUXG1LiQ #sequencenumber{fill:#333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .messageText{fill:#333;stroke:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .labelText,#mermaid-svg-V3Wp4YGPqUXG1LiQ .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .loopText,#mermaid-svg-V3Wp4YGPqUXG1LiQ .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-V3Wp4YGPqUXG1LiQ .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .noteText,#mermaid-svg-V3Wp4YGPqUXG1LiQ .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actorPopupMenu{position:absolute;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-V3Wp4YGPqUXG1LiQ .actor-man circle,#mermaid-svg-V3Wp4YGPqUXG1LiQ line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-V3Wp4YGPqUXG1LiQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 【明文传输阶段】 【核心黑客行为:掉包公钥】 网关拦截响应,存下真公钥 puKey。 自己生成一套假的公私钥:mitm_puKey / mitm_prKey 客户端误以为 mitm_puKey 是服务器的! 生成预主密钥,并用 mitm_puKey 加密 【核心黑客行为:窃取密钥】 网关拦截密文,用假私钥 mitm_prKey 解密! 【★ 成功拿到预主密钥 ★】 随后用服务器的真公钥 puKey 重新加密预主密钥 服务端用真私钥 prKey 解密,成功得到预主密钥 【致命后果】此时客户端、服务端、恶意网关三方 都同时拥有了:随机数1 + 随机数2 + 预主密钥! 三方分别算出了【一模一样的会话密钥】 【密文传输阶段】 此后客户端与服务端的加密数据,恶意网关都能用该会话密钥完美解密和篡改 1. 申请建立TLS连接 (带来 随机数1) 转发:申请建立TLS连接 (带来 随机数1) 2. 确认连接 (带来 随机数2 和 服务器真公钥 puKey) 转发确认:(带来 随机数2 和 假的公钥 mitm_puKey) 3. 发送加密后的预主密钥 转发重新加密后的预主密钥
证书机制
中间人攻击之所以能成功,是因为客户端无法确认通信对象是不是本人,只要有人说"我是你要找的服务器"那么客户端就信了.
而证书机制就是为了解决这个问题而诞生的
数字证书认证机构(简称CA)是一个权威的,可信任的第三方,只有被这个第三方认可的证书,才能证明这个通信身份是本人
证书是如何做到认证的呢?
- 证书内容
证书可以理解为一个结构化的字符串,通常里面具有以下信息:
- 证书发布机构:签发这份CA证书的CA机构
- 证书有效期:证书的有效期限
- 公钥:证书对外公开的密钥
- 证书所有者:通常是访问的网站
- 数字签名:用CA自身的私钥加密生成的效验值,若效验值错误意味证书被篡改
每当客户端要和服务端通信时,客户端都会拿到服务端提供的身份证(CA证书).客户端会着重检查以下三点:
- 判断证书的有效期是否过期
- 判断证书的发布机构是否信任(操作系统内置了信任证书发布机构)
- 验证证书是否被篡改:从操作系统中拿出对应CA发布机构的公钥来对数字签名进行解密(得到hash1).然后再重新计算整个证书的哈希值(得到hash2).当hash1==hash2,则证明证书未被篡改
- 那有没有可能,黑客也会伪造一个证书呢?
有可能,但浏览器会发现.由于证书带有数字签名,而这个数字签名是CA机构用私钥加密的hash值,黑客一旦修改证书内容,hash就会对不上. - 那把数字签名也修改了不就行了?
也不行.因为数字签名是由CA机构的私钥加密的hash值.黑客没有它的私钥,如果用黑客自己生成的私钥进行加密,客户端就无法使用操作系统内置的CA机构公钥进行解密 - 那黑客能不能自己弄一个CA机构,然后自己给自己颁发一个CA证书呢?
可以.但浏览器不认.使用自己颁发的证书,浏览器会先在操作系统中寻找该证书机构,如果找不到,就默认这个是非权威机构颁发的证书,故也会发现问题 - 那是不是有了证书机制HTTPS加密就无敌了,没人能进行中间人攻击了?
也不对.防止中间人攻击靠的就是权威机构证书.但如果你自己安装了来历不明的证书,浏览器就会觉得这个虽然不是权威机构证书(操作系统中找不到),但是一个可信任证书(用户指定安装的证书),从而认为通信是安全的.另外,如果安装了非官方的操作系统,也有可能会有人在操作系统中安装了恶意证书机构.毕竟能存在操作系统中的证书,浏览器都是默认可信任的
因此要保证证书安全,就得注意不要安装不明来历的证书和操作系统 - 证书效验的完整流程
服务端 客户端 服务端 客户端 #mermaid-svg-B8H3ngOLvDvzYsIm{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-B8H3ngOLvDvzYsIm .error-icon{fill:#552222;}#mermaid-svg-B8H3ngOLvDvzYsIm .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-B8H3ngOLvDvzYsIm .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-B8H3ngOLvDvzYsIm .marker{fill:#333333;stroke:#333333;}#mermaid-svg-B8H3ngOLvDvzYsIm .marker.cross{stroke:#333333;}#mermaid-svg-B8H3ngOLvDvzYsIm svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-B8H3ngOLvDvzYsIm p{margin:0;}#mermaid-svg-B8H3ngOLvDvzYsIm .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-B8H3ngOLvDvzYsIm text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-B8H3ngOLvDvzYsIm .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-B8H3ngOLvDvzYsIm .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-B8H3ngOLvDvzYsIm #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-B8H3ngOLvDvzYsIm .sequenceNumber{fill:white;}#mermaid-svg-B8H3ngOLvDvzYsIm #sequencenumber{fill:#333;}#mermaid-svg-B8H3ngOLvDvzYsIm #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-B8H3ngOLvDvzYsIm .messageText{fill:#333;stroke:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-B8H3ngOLvDvzYsIm .labelText,#mermaid-svg-B8H3ngOLvDvzYsIm .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .loopText,#mermaid-svg-B8H3ngOLvDvzYsIm .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-B8H3ngOLvDvzYsIm .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-B8H3ngOLvDvzYsIm .noteText,#mermaid-svg-B8H3ngOLvDvzYsIm .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-B8H3ngOLvDvzYsIm .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-B8H3ngOLvDvzYsIm .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-B8H3ngOLvDvzYsIm .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-B8H3ngOLvDvzYsIm .actorPopupMenu{position:absolute;}#mermaid-svg-B8H3ngOLvDvzYsIm .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-B8H3ngOLvDvzYsIm .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-B8H3ngOLvDvzYsIm .actor-man circle,#mermaid-svg-B8H3ngOLvDvzYsIm line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-B8H3ngOLvDvzYsIm :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 系统内置CA证书的公钥1 申请证书,获得CA机构私钥1 生成公钥2,私钥2 把公钥2放入证书,并使用私钥1进行签名 收到证书后判断使用公钥1解密签名 验证完证书合法性后获取证书中提供的公钥2 使用公钥2生成预主密钥,并使用预主密钥生成会话密钥 使用私钥2解密预主密钥,通过预主密钥生成会话密钥 接下的通信都使用会话密钥进行加密 发起连接请求 发送证书 发送预主密钥
总结
HTTPS相比HTTP只是做了一个加密.而这个加密使用的是TLS技术.TLS技术实现的本质对称密钥和非对称密钥
在HTTPS中,我们只需要着重记住3组密钥即可
- 用于检验证书的非对称密钥(防止中间人攻击)
- 用于协商会话密钥的非对称密钥(防止第三方获取会话密钥)
- 用户加密通信双方内容的对称密钥(防止第三方解密密文)
既然非对称密钥这么好用,为什么不一直使用非对称密钥呢?不必多此一举搞个对称密钥呀
原因是非对称密钥解密相比对称密钥解密麻烦许多.直白体现就是非对称密文解密很慢,为了通信效率,故使用对称密钥