【Linux-网络】HTTP的清风与HTTPS的密语

52bc67966cad45eda96494d9b411954d.png

🎬 个人主页:谁在夜里看海.

📖 个人专栏:《C++系列》《Linux系列》《算法系列》

⛰️ 道阻且长,行则将至


目录

📚 引言

📚 一、HTTP

📖 1.概述

📖 2.URL

🔖结构

🔖转义

📖 3.格式

🔖请求格式

🔖响应格式

📚二、HTTPS

📖 1.概念

📖 2.加密方式

🔖对称加密

🔖非对称加密

📖 3.数据摘要

🔖概念

🔖数字签名

📖 4.HTTPS的工作过程

🔖过程推断

🔖证书 


📚 引言

上一篇文章我们讲述了TCP/UDP协议,那是位于传输层的负责端到端通信,确保数据的可靠传输的协议,这篇文章我们来谈一谈应用层的协议。

如果说传输层协议的作用是确保数据能够传输到位,那么应用层协议的作用就是确保数据能被正确解析。具体地说,应用层协议决定了数据在网络上传输时的结构、顺序、传输规则以及数据如何被应用程序解释,应用层协议有效支持不同设备、操作系统和应用程序之间的相互通信和数据交换。

应用层协议可以由我们程序员自己定义,只需要通信双方遵守相同的协议即可,不过在现实中,已经有许多现成且优秀的应用层协议供我们参考使用,其中之一就是我们下面要讲述的HTTP(超文本传输协议)

📚 一、HTTP

📖 1.概述

HTTP(HyperText Transfer Protocol) 是一种用于客户端(通常是浏览器)与服务器之间传输超文本(主要是网页)的协议。它是Web通信的基础协议,用于支持浏览器与Web服务器之间的请求和响应。

虽然HTTP的通用客户端是浏览器,但这并不意味着HTTP是基于浏览器的协议,事实上它广泛用于各种客户端与服务器间的通信,除了浏览器之外,其他许多应用(如移动应用、API、爬虫等)也使用HTTP协议进行数据交换:

① 在浏览器中:我们使用HTTP协议来请求Web服务器上的资源。当你输入一个网址(如www.example.com)并按下回车时,浏览器实际上向服务器发送一个HTTP请求服务器返回相应的HTTP响应,其中包含网页内容。

② 其他应用程序:HTTP并不仅限于浏览器,其他应用程序(如移动应用桌面应用API接口等)也可以通过HTTP协议与服务器进行数据交换。

📖 2.URL

URL(Uniform Resource Locator)是一种用于标识互联网资源的地址,我们平时俗称的“网址”就是URL,URL除了可以指向网页,还可以指向图片、视频、文件、API接口等网络资源。它的作用是帮助客户端(如浏览器)在互联网上找到并访问特定的资源

🔖结构

一个典型的URL格式如下:

http://user:pass@www.example.jp:80/dir/index.htm?uid=1#ch1

① 协议 http:// 指定了访问该URL时使用的协议,http标识使用HTTP(超文本传输协议);

② 用户信息 user:pass@ 这个部分是可选的,表示URL的用户名和密码,通常用于需要身份验证的站点。user是用户名,pass是密码,这种方式称为基本认证

③ 主机名 www.example.jp 这是服务器的主机名(或域名),表示要连接的Web服务器地址;

④ 端口 :80 这是可选的,表示与目标服务器通信时使用的端口号。80是HTTP协议的默认端口。如果未指定端口,HTTP会默认使用端口80;

⑤ 路径 /dir/index.htm 这部分表示服务器上的资源路径,指向某个文件或目录;

⑥ 查询参数 ?uid=1 这是URL的查询部分,通常用于向服务器传递额外的参数;

⑦ 片段标识符 #ch1 片段标识符是URL的一个可选部分,通常用于标识资源中的某个位置或段落。

🔖转义

像 / ? : 等这样的字符, 已经被URL当做特殊意义理解了,因此这些字符不能随意出现。因此,某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义

转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY 格式 

例如:

这里“+”就被转义成“%2B”。

urlencode urldecode 分别是编码和解码的过程,我们可以用在线转义工具对URL进行转义:

UrlEncode编码和UrlDecode解码-在线URL编码解码工具

📖 3.格式

HTTP有两种基本的消息格式:请求格式(Request)响应格式(Response)

🔖请求格式

请求格式由以下几个部分组成:

请求行
请求头
空行
请求体

示例:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8

name=John&age=25

① 请求行

请求行包含请求方法、请求的资源路径和协议版本

<方法> <请求路径> <协议版本>

方法:HTTP请求的方法指明客户端希望对指定资源执行的操作。常见的方法有:

GET:请求指定资源,仅读取资源,不进行修改幂等,即多次执行统一操作结果不变)

POST:向指定资源提交数据(不幂等,多次提交会创建多份资源)

PUT:向指定资源上传数据(如果资源存在,替换该资源;资源不存在则创建,因此幂等

DELETE:删除指定资源

HEAD:与GET类似,不过只获取响应头部,不获取实体内容

请求路径:指定要请求的资源的路径(可以是相对路径或绝对路径)

协议版本:表明使用的HTTP协议的版本,常见的有HTTP/1.1HTTP/2

② 请求头

请求头是由多个键值对组成,用于提供额外的请求信息,如浏览器类型、支持的编码格式、Cookie信息等。请求头通常包括以下内容:

Host:指定服务器的域名或IP地址

User-Agent:客户端的浏览器和操作系统信息

Accept:浏览器可以处理的响应内容类型

Content-Type:请求体的内容类型,通常在POSTPUT请求中使用

Authorization:用于HTTP认证的信息

Cookie:客户端的Cookie信息

③ 空行

请求头和请求体之间会有一个空行,用于分隔请求头和请求体部分。

④ 请求体

请求体包含了实际发送到服务器的数据,通常在POSTPUT等请求方法中使用。对于GET等方法,请求体一般为空。

🔖响应格式

响应格式由以下几个部分组成: 

响应行
响应头
空行
响应体

示例:

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Server: Apache/2.4.7 (Ubuntu)

<html>
  <body>
    <h1>Welcome to my website</h1>
  </body>
</html>

① 响应行

响应行由协议版本状态码状态描述组成。格式如下:

<协议版本> <状态码> <状态描述>

协议版本:表明使用的HTTP协议版本 

状态码:服务器返回的数字代码,表示响应的状态

2xx:请求成功(如200 OK

3xx:重定向(如301 Moved Permanently

4xx:客户端错误(如404 Not Found

5xx:服务器错误(如500 Internal Server Error

状态描述:状态码的简要描述(如OKNot Found) 

② 响应头

响应头包含了关于服务器、响应内容以及其他一些元数据的描述。常见的响应头包括:

Content-Type:响应体的媒体类型

Content-Length:响应体的大小(以字节为单位)

Server:服务器软件的名称

Location:用于重定向的URL

Set-Cookie:设置客户端的Cookie

③ 空行 

响应头和响应体之间也有一个空行,用于分隔响应头和响应体部分。

④ 响应体

响应体包含了实际的资源数据或响应内容。它可以是HTML页面、JSON数据、图片等。

📚二、HTTPS

📖 1.概念

由于HTTP的内容是明文传输的,明文数据会经过路由器、WiFi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击,所以我们才需要对数据进行加密。

加密就是把明文(要传输的信息)进行一系列变换,形成密文

解密就是把密文再进行一系列变换,还原成明文

在这个加密和解密的过程中,往往需要一个或者多个中间的数据辅助这个过程,这样的数据就叫做密钥

HTTPS在HTTP的基础上加入了SSL/TLS(安全套接字层/传输层安全协议)加密协议,用来对网络通信进行加密和认证,从而确保数据在传输过程中不被窃取、篡改或伪造。简单来说,HTTPS是HTTP协议的加密版本,用于保护HTTP通信的安全性

📖 2.加密方式

加密方式有许许多多,但总体可以分成对称加密非对称加密

🔖对称加密

采⽤单钥密码系统的加密⽅法,同⼀个密钥可以同时⽤作信息的加密和解密,这种加密⽅法称为对 称加密,也称为单密钥加密,特征:加密和解密所⽤的密钥是相同的。

工作原理:

① 加密:发送方使用密钥将明文数据转换成密文;

② 传输:密文通过不安全的通道(网络)发送到接收方;

③ 解密:接收方使用相同的密钥将密文还原成明文。

⚠️加密与解密的实现基于通信双方使用相同的加密/解密算法,因此加密算法可以看作是公开的

例如:简单的对称加密,加密/解密算法为按位异或

明文a ^ 密钥b 得到 密文c;

密文c ^ 密钥b 还原会明文 a。

因为加密和解密都使用同一个密钥,所以密钥的管理和安全性至关重要。如果密钥泄露,任何人都能解密收到的数据

🔖非对称加密

与对称加密不同,非对称加密的加密与解密所使用的密钥是不同的,其中一个是公开密钥(简称公钥),一个是私有密钥(简称私钥)

工作原理:

① 加密:发送方使用公钥将明文数据转换成密文;

② 解密:接受放使用私钥将密文数据还原成明文。

(当然公钥和私钥也可以反着用)

这种方式的核心思想是,虽然每个人都可以通过公钥来加密数据,但只有持有相应私钥的人才能解密数据。由于公钥和私钥是成对生成的,公钥和私钥之间具有数学上的关系,但私钥不能从公钥推算出来

⚠️这种方法最大的缺点是:运算速度⾮常慢。

📖 3.数据摘要

上述的加密方法可以确保明文数据不会泄露,即使密文在传输过程中被中间人截取,但如果没有对应的密钥就无法将密文还原成明文。但是除此之外,我们还需要考虑一个问题,那就是数据完整性

如果密文被中间人截取,他可以在不清楚密钥的情况下对密文进行修改,这样接收方得到的就不是原来的密文,也无法还原成正确的明文了,所以我们还需要保证密文在传输过程中不被修改。于是引入了数据摘要的概念。

🔖概念

数据摘要(数字指纹)的基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字摘要并不是⼀种加密机制,因为它没有解密的过程。

工作原理:

① 生成摘要:对数据进行运算生成数字摘要;

② 验证完整性:接收方对数据进行相同运算,将结果与摘要进行比对,若相同则表示未被修改。

⚠️但还有问题,如果中间人对数据修改后,将摘要也一并修改了,这样接收方就看不出来数据被篡改了,这该怎么解决呢?

🔖数字签名

既然如此,我们将数据摘要也进行加密,就得到了数据签名。我们使用非对称加密方式,那么接收方的验证步骤就变成了:

① 使用私钥将数字签名还原成数字摘要;

② 将数据用哈希函数进行运算,得到结果与数字摘要进行比对,验证完整性。

📖 4.HTTPS的工作过程

直接介绍HTTPS的工作原理可能会有些难以理解,有了以上的知识储备,我们可以自行推断一下HTTPS的工作过程:

🔖过程推断

① 只使用对称加密

即通信双方各自持有一个相同的密钥,发送数据时,使用密钥对明文加密;接收数据时使用密钥将密文还原。如果这个密钥只有通信双方知晓,那么通信安全就可以得到保证。

但是并没有想象的这么简单,服务器需要同时对很多客户端提供服务,如果与每个客户端使用的密钥都不一样,那么服务器还需要维护客户端与密钥的关联关系,这非常繁琐。这种方法行不通。

② 只使用非对称加密

如果通信双方都使用非对称加密呢,即双方都持有各自的公钥私钥对,通信过程为:

1️⃣在通信前,双方先交换各自的公钥;

2️⃣服务器发送数据:使用客户端的公钥对数据加密;服务器接收数据:使用自己的私钥对数据解密。

3️⃣客户端发送数据:使用服务器的公钥对数据加密;客户端接收数据:使用自己的私钥对数据解密。

⚠️但是我们上面提到了,非对称加密的最大问题是运算速度很慢,如果双方都使用非对称加密的话,效率太低了。这种办法也行不通

③ 非对称加密+对称加密

方法①的运行速度快,但问题在于,服务器要存储管理每个客户端的对称密钥,不论是否正在进行通信。那么我们可不可以优化一下,只在通信的过程中保存对称密钥,通信结束就解除绑定:

1️⃣服务器拥有一对非对称密钥对,与客户端进行通信前,先将公钥发送给客户端;

2️⃣客户端将自己的对称密钥通过公钥加密,发送给服务器;

3️⃣服务器通过解密得到对称密钥,之后的通信就可以通过这个对称密钥进行了。

上述过程只进行了一次非对称加密解密过程,后面的操作全都是对称的,这样一来相比方法②大大提高了效率,看似是最可行的,但是!

上述过程都忽略了一个重要问题:如果在通信开始前,中间人攻击就已经存在了呢 ?

拿方法③举例,服务器将公钥发送给客户端时被中间人截获,中间人把自己的对称密钥加密后发送给服务器,这样一来,中间人就可以假冒客户端与服务器进行通信,而服务器对此一无所知;

相同地,中间人可以将自己的公钥发送给客户端,并获取客户端的对称密钥,这样一来,中间人就可以假冒服务器与客户端进行通信,客户端对此也一无所知!

上面的问题关键在于:客户端不能确定公钥的来源,如果可以确定公钥来自于服务器,就可以放心地将私钥加密发送过去了。

要解决上述问题,就要引入证书的概念:

🔖证书 

服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信 息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威

所以服务器向客户端发送的其实是包含公钥信息的证书,那么客户端怎么通过证书验证公钥的来源正确性呢?

方法①:直接查看域名信息是否正确,但是如果证书被中间人篡改了呢,公钥已经被替换了呢?

这里就要用到我们提到过的数据签名。通过数据签名,我们可以确保证书的完整性,具体步骤为:

1️⃣客户端收到证书,向CA机构申请还原签名为数据摘要(私钥只有CA机构拥有,确保了安全性);

2️⃣将明文信息通过哈西函数进行运算,将结果与摘要比对,如果相同,则公钥可信;如果不相同,则公钥不可信。

如此一来,就解决了中间人攻击的问题。

❓那如果中间人发送了一个合法的证书呢(中间人向CA机构申请了一个证书)

✅只需要查看域名信息即可

❓如果中间人用于申请证书的域名与真域名极度相似,造成混淆呢

✅这就需要公安机关来“重拳出击”了✊


以上就是【HTTP的清风与HTTPS的密语】的全部内容,欢迎指正~ 

码文不易,还请多多关注支持,这是我持续创作的最大动力!

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

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

相关文章

2025-03-05 学习记录--C/C++-PTA 习题5-6 使用函数输出水仙花数

合抱之木&#xff0c;生于毫末&#xff1b;九层之台&#xff0c;起于累土&#xff1b;千里之行&#xff0c;始于足下。&#x1f4aa;&#x1f3fb; 一、题目描述 ⭐️ 二、代码&#xff08;C语言&#xff09;⭐️ #include <stdio.h>int narcissistic( int number ); vo…

Vue的简单入门 三

目录 侦听器 watch 注意 表单输入绑定 v-model v-model修饰符​编辑 lazy number Trim 模板引用 组件组成 组件引用三步走 组件的嵌套关系 header Main Aside Aritice Item App.vue组件引入三个子组件 组件的注册方式 全局注册组件的方法 (1) Vue 2 语…

跨域-告别CORS烦恼

跨域-告别CORS烦恼 文章目录 跨域-告别CORS烦恼[toc]1-参考网址2-思路整理1-核心问题2-个人思考3-脑洞打开4-个人思考-修正版1-个人思考2-脑洞打开 3-知识整理1-什么是跨域一、同源策略简介什么是源什么是同源是否是同源的判断哪些操作不受同源策略限制跨域如何跨域 二、CORS 简…

大模型核心要素完全解析:从数字神经元到智能对话的奥秘

一、神经网络的基石&#xff1a;模型参数 1.1 参数的本质解密 大模型参数是指在大规模机器学习模型&#xff0c;特别是像大型语言模型&#xff08;LLM&#xff09;等中&#xff0c;用于描述模型结构和功能的各种变量和数据。 其中大模型参数又分为权重参数和偏置参数&#x…

Android ChatOn-v1.66.536-598-[构建于ChatGPT和GPT-4o之上]

ChatOn 链接&#xff1a;https://pan.xunlei.com/s/VOKYnq-i3C83CK-HJ1gfLf4gA1?pwdwzwc# 添加了最大无限积分 删除了所有调试信息 语言&#xff1a;全语言支持

前端开发10大框架深度解析

摘要 在现代前端开发中&#xff0c;框架的选择对项目的成功至关重要。本文旨在为开发者提供一份全面的前端框架指南&#xff0c;涵盖 React、Vue.js、Angular、Svelte、Ember.js、Preact、Backbone.js、Next.js、Nuxt.js 和 Gatsby。我们将从 简介、优缺点、适用场景 以及 实际…

NL2SQL-基于Dify+阿里通义千问大模型,实现自然语音自动生产SQL语句

本文基于Dify阿里通义千问大模型&#xff0c;实现自然语音自动生产SQL语句功能&#xff0c;话不多说直接上效果图 我们可以试着问他几个问题 查询每个部门的员工数量SELECT d.dept_name, COUNT(e.emp_no) AS employee_count FROM employees e JOIN dept_emp de ON e.emp_no d…

2025年渗透测试面试题总结-字某跳动-渗透测试实习生(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 字某跳动-渗透测试实习生 渗透流程信息收集如何处理子域名爆破中的泛解析问题绕过CDN寻找真实IPPHPINFO页面关注…

从文件到块: 提高 Hugging Face 存储效率

Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制&#xff0c;任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本&#xff0c;因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…

大型语言模型演变之路:从Transformer到DeepSeek-R1

大型语言模型的崛起被认为是人工智能领域的一次革命&#xff0c;从2017年Transformer架构的引入开始&#xff0c;到2025年DeepSeek-R1的推出&#xff0c;每一步都在不断改变着人机交互的方式&#xff0c;推动着学术界与产业界的深度融合。 1. Transformer的引领&#xff08;201…

设计模式(7)——SOLID原则之接口隔离原则

设计模式&#xff08;7&#xff09;——SOLID原则之接口隔离原则 概念示例总结 概念 客户端不应被强迫依赖于其不使用的方法。这句话的意思是指尽量缩小接口的范围&#xff0c;使得客户端的类不必实现其不需要的行为。 根据接口隔离原则&#xff0c;你必须将“臃肿”的方法拆…

Excel的行高、列宽单位不统一?还是LaTeX靠谱

想要生成田字格、米字格、带拼音标准&#xff0c;方便小学生书法和练字。Word&#xff0c;Excel之类所见即所得是最容易相当的方式。但它们处理带田字格之类背景时&#xff0c;如果没有专用模板、奇奇怪怪的插件&#xff0c;使用起来会碰到各种问题。比如&#xff0c;Word里面用…

C++学习之路,从0到精通的征途:入门基础

目录 一.C的第一个程序 二.命名空间 1.namespace的价值 2.命名空间的定义 3.命名空间使用 三.C的输入与输出 1.<iostream> 2.流 3.std(standard) 四.缺省参数 1.缺省参数的定义 2.全缺省/半缺省 3.声明与定义 ​五.函数重载 1.参数个数不同 2.参数类型不…

rust学习笔记12-hashmap与1. 两数之和

rust集合中也有hashmap&#xff0c;昨天已经提到过&#xff0c;学过java同学再熟悉不过了&#xff0c;一道经典面试题问hashmap在java1.8的实现原理&#xff0c;数组哈希表红黑树&#xff0c;rust中hashmap在功能上和java一样&#xff0c;但实现上有很大差别&#xff0c;它的基…

通过多线程同时获取H264和H265码流

目录 一.RV1126 VI采集摄像头数据并同时编码H264、H265的大概流程​编辑​编辑 1.1初始化VI模块&#xff1a; 1.2H264、H265的VENC模块初始化&#xff1a; 1.3VI分别绑定H264的VENC层和H265的VENC层&#xff1a; ​​​​​​​1.4开启H264线程采集H264的VENC数据&#xff…

SpringBoot为什么要禁止循环依赖?

大家好&#xff0c;我是锋哥。今天分享关于【SpringBoot为什么要禁止循环依赖?】面试题。希望对大家有帮助&#xff1b; SpringBoot为什么要禁止循环依赖? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Boot 和 Spring 框架之所以要避免循环依赖&#xf…

The Rust Programming Language 学习 (三)

所有权 所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收器&#xff08;garbage collector&#xff09;即可保证内存安全。因此&#xff0c;理解 Rust 中所有权的运作方式非常重要。 这里是非常重非常重的一个知识点,这里一…

基于物联网技术的电动车防盗系统设计(论文+源码)

1总体设计 本课题为基于物联网技术的电动车防盗系统&#xff0c;在此将整个系统架构设计如图2.1所示&#xff0c;其采用STM32F103单片机为控制器&#xff0c;通过NEO-6M实现GPS定位功能&#xff0c;通过红外传感器检测电瓶是否离开位&#xff0c;通过Air202 NBIOT模块将当前的数…

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台&#xff0c;可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点&#xff1a; 容器&#xff1a;Docker 使用容器来封装应用程序及其依赖项&#xff0c;使其能够在任何环境中都能…

解决docker认证问题 failed to authorize: failed to fetch oauth token

报错信息[bash1]解决方案 全局代理打开“buildkit”: false &#xff0c;见[图1] [bash1] >docker build -t ffpg . [] Building 71.8s (3/3) FINISHED docker:desktop-linux> [internal] load bui…