【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.8name=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的密语】的全部内容,欢迎指正~ 

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过数据库网格架构构建现代分布式数据系统

在当今微服务驱动的世界中&#xff0c;企业在跨分布式系统管理数据方面面临着越来越多的挑战。数据库网格架构已成为应对这些挑战的强大解决方案&#xff0c;它提供了一种与现代应用架构相匹配的分散式数据管理方法。本文将探讨数据库网格架构的工作原理&#xff0c;以及如何使…

RangeError: Radix must be an integer between 2 and 36

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

荆为好的专栏推荐

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点下班 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 专栏推荐特别篇1. 后端专栏推荐2. 云原生专栏…

Bean 的生命周期主要包括以下阶段:

Bean 的生命周期主要包括以下阶段&#xff1a; 定义 &#xff1a;在配置文件或注解中定义 Bean&#xff0c;包括其类、作用域等信息。 实例化 &#xff1a;Spring 容器根据定义创建 Bean 的实例。 属性赋值 &#xff1a;容器为 Bean 设置配置的属性值。 初始化 &#xff1a;…

计算机基础:二进制基础06,用八进制来计数

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;计算机基础&#xff1a;二进制基础05&#xff0c;八进制简介 回…

图论-腐烂的橘子

994.腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a;值 0 代表空单元格&#xff1b; 值 1 代表新鲜橘子&#xff1b; 值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到…

TypeError: Cannot create property ‘xxx‘ on string ‘xxx‘

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…

嵌入式硬件设计SPI时需要注意什么?

嵌入式硬件设计SPI时需要注意什么? 1. 硬件设计注意事项 关键点注意事项1. 信号完整性- 缩短SCK、MOSI、MISO的走线长度,避免反射干扰。- 使用屏蔽线或差分信号(高速场景)。- 阻抗匹配(特别是高频信号,如50Ω端接)。2. 电源与地线- 电源去耦:每个SPI芯片的VCC附近放置0…

git-filter-repo 清除大文件教程

git filter-repo 是一个用于过滤和清理 Git 仓库历史的工具&#xff0c;它可以高效地批量修改提交历史中的文件内容、删除文件、重命名文件以及进行其他历史重构操作。相较于 git filter-branch&#xff0c;它通常更快且更易于使用。 以下是一个基本示例&#xff0c;说明如何使…

STM32之软件SPI

SPI传输更快&#xff0c;最大可达80MHz&#xff0c;而I2C最大只有3.4MHz。输入输出是分开的&#xff0c;可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意&#xff1a;所有设备需要共地&#xff0c;时钟线主机输出&…

Git清理本地残留的、但已经在服务器上被删除的分支

要筛选出已经被服务器删除的本地分支&#xff0c;并在本地删除这些分支&#xff0c;可以按照以下步骤进行操作&#xff1a; 步骤 1: 获取远程分支信息&#xff0c;确保本地的远程分支信息是最新的&#xff1a; git fetch -p步骤 2: 列出本地分支和远程分支&#xff1a; git …

DeepSeek 掌舵创意方向+即梦 AI 绘制梦幻蓝图,引领创作潮流

我的个人主页 我的专栏&#xff1a; 人工智能领域、java-数据结构、Javase、C语言&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01; 点赞&#x1f44d;收藏❤ 前言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能已然成为推动各领域变革与创新的核心驱…

elasticsearch商业产品

Elasticsearch商业产品介绍 在当今数字化时代&#xff0c;数据如同石油一样珍贵。而要从海量的数据中提取有价值的信息&#xff0c;则需要强大的工具。这就是Elasticsearch商业产品的用武之地。Elasticsearch是一款开源的搜索引擎&#xff0c;它能够快速地存储、搜索和分析大规…

DeepSeek本地接口调用(Ollama)

前言 上篇博文&#xff0c;我们通过Ollama搭建了本地的DeepSeek模型&#xff0c;本文主要是方便开发人员&#xff0c;如何通过代码或工具&#xff0c;通过API接口调用本地deepSeek模型 前文&#xff1a;DeepSeek-R1本地搭建_deepseek 本地部署-CSDN博客 注&#xff1a;本文不仅…

Deepin下创建WebStorm快捷方式

个人博客地址&#xff1a;Deepin下创建WebStorm快捷方式 | 一张假钞的真实世界 下载WebStorm并解压至安装目录&#xff0c;默认的只能通过命令行启动&#xff0c;每次都需要先打开终端&#xff0c;很不方便。解决方法是创建快捷方式&#xff0c;并驻留任务栏。这样点击任务栏上…

物联网系统搭建

实验项目名称 构建物联网系统 实验目的 掌握物联网系统的一般构建方法。 实验要求&#xff1a; 1&#xff0e;构建物联网系统&#xff0c;实现前后端的交互。 实验内容&#xff1a; CS模式MQTT&#xff08;不带数据分析处理功能&#xff09; 实现智能设备与应用客户端的交…

从零开始用HTML、CSS和JavaScript制作贪吃蛇网页小游戏

〇、前言 贪吃蛇是一款经典的休闲游戏&#xff0c;在诺基亚手机时代风靡全球。 作为编程入门者&#xff0c;实现一个贪吃蛇游戏是学习Web前端技术的绝佳练习。 名人说&#xff1a;博观而约取&#xff0c;厚积而薄发。——苏轼《稼说送张琥》 创作者&#xff1a;Code_流苏(CSDN…

LeetCode1328

非常抱歉&#xff0c;我理解错了你的要求&#xff01;现在我会严格按照你的要求重新组织内容&#xff0c;确保在代码段中不加入注释&#xff0c;并在代码逐行讲解中加入代码段。 LeetCode1328 目录 题目描述示例思路分析代码段代码逐行讲解复杂度分析总结的知识点整合总结 题…

STM32点亮LED灯

1.1 介绍&#xff1a; LED模块。它的控制方法非常简单&#xff0c;要想点亮LED&#xff0c;只要让它两端有一定的电压就可以&#xff1b;实验中&#xff0c;我们通过编程控制信号端S的高低电平&#xff0c;从而控制LED的亮灭。我们提供一个测试代码控制LED模块上实现闪烁的效果…

【华三】STP端口角色与状态深度解析

STP端口角色与状态深度解析&#xff1a;构建无环网络的基石 引言一、STP基础回顾二、端口角色详解1. 根端口&#xff08;Root Port&#xff09;2. 指定端口&#xff08;Designated Port&#xff09;3. 非指定端口&#xff08;阻塞端口&#xff09; 三、端口状态转换流程四、角色…