Linux网络:HTTPS协议
Linux网络:HTTPS协议
- 加密方式
- 对称加密
- 非对称加密
- 混合加密
- 中间人攻击
- 证书
- 数据签名
- CA认证
- HTTPS
- SSL/TSL
- HTTPS
在HTTP协议中,所有的数据都采用明文的形式传输,这就会导致数据非常容易泄露,只要拿到HTTP报文,就可以窃取各种信息。
基于HTTP协议,使用一定的加密措施,让HTTP内部的数据变为密文,就升级为了HTTPS协议,其中S表示Secure或者Safe,都是安全的意思。
加密方式
对称加密
对称加密是一种采用单个密钥的加密方式,通信双方采用的密钥相同,因此称为对称加密。

常见的对称加密算法有:DES、3DES、AES、TDEA
这些算法是公开的,但是密钥不是公开的,只要通信双方的密钥不泄露,就算别人知道使用了哪一个算法,也无法解密密文。
比如一个简单的对称加密算法:加减法。
假设现在对数据123456进行加密,密钥C = 6。
- 服务端使用密钥
C加密:
123456 - 6 = 123450
此时就得到密文123450,将密文通过HTTP发送给客户端。
- 客户端使用密钥
C解密:
123450 + 6 = 123456
客户端就拿到了最终数据123456。
假设某个黑客截取到了HTTP报文,破解出数据为123450,也知道使用了加减法,这个黑客可以得到原数据吗?
当然不可以,因为黑客没有密钥C,他不知道123450这个密文要与谁进行加法,自然得不到原数据。
以上过程只是简单了解原理,实际上不会用加减法这样简单的计算来做加密。
如果服务端与客户端通信前都约定好,使用指定的加密算法和密钥C,那么就可以保证这个通信是安全的。
比如一个服务端与它的多个客户端都使用C作为密钥:

但是这样有一个问题,如果任意一个客户端泄露了这个密钥C,那么所有客户端的信息都会被泄露。因此实际上并不会对所有的客户端采用相同的密钥,而是每个客户端都使用不同的密钥。
如果每个客户端都使用不同密钥,那么就不能再提前约定了,因为服务端并不知道未来有哪些客户端要连接自己,所以在正式通信前,要为每个客户端生成一个密钥,并告知客户端。

问题来了,这个告知客户端密钥的消息是不被加密的,黑客就可以截取第一次报文,查看到这个密钥。此后虽然客户端与服务端都有密钥C,但是黑客也有密钥C,即使后续进行通信时数据会被加密,但是对于黑客来说和明文传输没有区别。
对称加密有以下特点:
- 简单
- 计算量小,加密速度快,效率高
非对称加密
非对称加密采用两个密钥完成:
公钥 S:公开的密钥,任何人都可以知道这个密钥私钥 S*:私有的密钥,只有非常少的人知道
公钥和私钥是配对的,它们一个负责加密,一个负责解密,有以下两种情况:
- 使用公钥
S加密:
拥有公钥的用户可以加密,拥有私钥的人可以解密。而公钥是完全公开的,也就是说任何人都可以加密一个数据,发送给持有私钥的人。而私钥只有少数人持有,说明只有少数人有资格查看加密的数据。
举个例子,在校长办公室门口有一个信箱,所有学生都可以投放信件,提出建议。而提出的建议被放到信箱内部,其他人打不开信箱,就无法查看学生的建议,这样投放信件到信箱的过程,就是使用公钥加密数据的过程,任何一个人都可以加密数据。
如果想要查看信箱内部的信件,那么就必须有信箱的钥匙,而钥匙只有校长有,这个信箱钥匙就是私钥。只有校长可以看信件,也就是只有私钥持有者有资格查看数据。
- 使用私钥
S*加密
使用私钥加密与之前是相反的过程,只有私钥的持有者有资格加密数据,但是任何人都可以查看加密后的数据。
也举个例子,这就像学校发布的告示文件,这种文件往往需要学校盖章,表示这个文件是本校发布的,具有权威性。那么这个公章就是私钥,只有持有公章的人有资格代表学校发布告示,而任何人都可以阅读这个告示。
在网络通信中,由于双方都需要收发数据,如果采用非对称加密,那么就要采用两对公钥和私钥。
假设服务端生成S S*这对密钥,客户端生成C C*这对密钥,采用私钥进行加密,公钥进行解密。

如果黑客截取到了密文,就算它持有两个公钥S和C,但是解密报文需要私钥S*和C*,这个只有客户端和服务端分别持有,那么黑客就无法破解数据。
每一个客户端与服务器都要维护两对密钥,那么这两对密钥就需要临时生成,在最开始需要进行公钥的交换。

最开始客户端与服务端互相不知道公钥,那么就需要互相告知自己的公钥,交换公钥的过程是不加密的,黑客就可以拿到公钥S和C,但是就算黑客拿到了两个公钥,它也破解不了报文。因为报文是拿公钥加密的,要拿私钥解密,而客户端与服务端之间各自生成私钥,根本没有把私钥发送到网络上,黑客就无法破解报文!
这样看起来很完美了,但是它无法抵挡中间人攻击,这个稍后讲解。
非堆对称加密比较复杂,而且加密速度慢。
混合加密
总结以上两个加密方式:
对称加密:效率高,如果黑客在交换密钥时入侵,加密会失效非对称加密:效率低,如果黑客在交换密钥时入侵,加密依然有效
那么能不能结合一下两者,集合它们的优点?
在对称加密中,主要是害怕第一次交换密钥会泄露,因此第一次交换密钥需要进行一次额外的加密。问题就变成了:在对称加密交换密钥时,需要对密钥加密。
对这个对称密钥加密,不能采用对称加密的方式,必须采用非对称加密,因为非对称加密不怕交换密钥时的黑客入侵。

流程如下:
- 服务端生成非对称密钥
S与S* - 服务端告知客户端公钥为
S - 客户端生成对称密钥
C - 客户端告知服务端对称密钥为
C,并使用公钥S加密 - 服务端使用
S*解密报文,得到对称密钥为C - 后续所有通信采用对称密钥
C
这个连接过程中,只有第一个报文告知S公钥是没有加密的,而非对称加密不怕公钥泄露。随后客户端利用这一层非对称加密,来加密密钥C,这样就可以保证C的安全性。
随后所有的通信都采用C,就可以提高加密的效率,又不怕C被泄露,这就是结合前两者的混合加密。
不过这种加密方式也害怕中间人攻击。
中间人攻击
中间人攻击简称MITM,先前两种加密方式看似都很完美,但是都逃不过中间人攻击。
在进行密钥交换之前,必然要建立TCP连接,而在建立连接的过程中,有可能会有第三者入侵。
假设当前TCP连接建立完成,但是发生了中间人入侵。

中间人入侵后,此时server以为middle是客户端,client以为middle是服务端。
以混合加密为例,展示中间人是如何绕开加密的:
首先server生成非对称密钥S和S*,并发送公钥S给中间人(server以为中间人是客户端):

你可能以为,公钥根本就不怕被公开,此时middle就算拿到了公钥S也没有任何作用。这确实没错,但是这也是中间人攻击最巧妙的一步:自己再生成一对非对称密钥M和M*。

客户端接收到公钥M后,以为这是服务端发送来的消息,以为服务端的公钥是M。
客户端生成对称密钥C,通过公钥M加密发送给中间人:

此时中间人通过私钥M*解密报文,得到对称密钥为C,于是再伪装自己是客户端,把C利用公钥S加密发回给服务端。
随后客户端与服务端采用C进行加密通信:

客户端与服务端都以为自己完成了完美的加密过程,但是其实中间人早已经拿到了对称密钥C,后续的所有报文中间人都可以轻松破解。
导致中间人攻击的源头,就是第一次交换公钥S,客户端无法得知自己收到的公钥是来自于服务端还是中间人。
证书
由于客户端无法确定与自己通信的是否是服务端还是中间人,此时一个CA机构站了出来,它维护了一个公钥A和一个私钥A*,把公钥告知给所有的浏览器。当服务器发送数据前,可以找CA机构进行认证,生成一个证书,客户端拿到数据后,通过检验证书来得知与自己通信的是否是目标服务器。
数据签名
数据签名是一种基于非对称加密的校验方式,其可以检测出数据是否被篡改。
- 生成报文:

当发送数据时,先把数据data使用哈希算法生成一个哈希值,在把哈希值通过私钥A*进行加密,这样就得到了签名。
最后发送报文时,把data和签名一起发送出去。
- 验证报文:

接收方从收到的报文中,解析出data和签名两个部分。
- 对
data使用相同的哈希函数,得到一个哈希值 - 使用公钥
A对签名解密,得到另一个哈希值 - 对比两个哈希值
依据哈希算法的特性,如果两个数据的哈希值不同,那么这两个数据一定不同。因此只要数据被篡改,那么此处两个哈希值就不同。
那么在加密过程中,到底哪一步需要通过数据签名进行确认?就是第一步:服务端给客户端发送公钥时,将自己的公钥,域名等信息一起打包作为数据data,并进行签名发送给客户端。
此时如果发生中间人攻击,中间人如果替换了公钥,那么就会造成data与原先不一致,进而导致哈希值不同,客户端就知道有中间人的存在了。
CA认证
将域名,公钥等信息进行打包得到data,在加上这个data的签名,就是一个证书,也就是说证书 = 服务端信息 + 签名。
证书由CA机构进行颁发,用于保证证书的权威性。先前说过,CA机构会自己维护一个私钥A*,不透露给任何人,并且所有浏览器都会内置对应的公钥A。

服务器配置HTTPS协议前,要想CA机构申请证书,服务器先生成非对称密钥S和S*,并把这些信息打包发送给CA机构。CA机构会对这些信息进行确认,如果验证通过,就利用哈希函数和私钥A*对这个数据生成签名,并把签名和服务端信息打包成证书,发送给服务端。
后续服务端再与客户端通信,只需要把证书发给客户端。由于浏览器内置了公钥A,客户端就可以检测签名是否正确,域名是否是目标域名,从而确认该公钥确实来自于服务器,随后执行混合加密过程,生成对称密钥C,完成真正的加密通信。
基于这种CA认证的方式,中间人就无法对证书进行修改或者掉包。
- 中间人修改证书
如果中间人修改了证书中的公钥S,将其变为自己的公钥M,此时签名就无法匹配修改后的数据,客户端就得知证书被修改了。
- 中间人掉包证书
如果中间人想要掉包证书,那么就要保证自己证书中的签名可以被A解密,那么中间人就需要持有A*,但是A*被CA机构严格维护,中间人得不到。
中间人也可以向CA机构申请证书完成掉包,但是申请证书需要同时提交域名和公钥。
- 中间人使用服务端的域名,配上自己的公钥
M申请证书,CA机构会进行审核,发现匹配不上,不会给中间人颁发证书 - 中间人拿自己的域名,配上自己的公钥
M申请证书,虽然可以得到证书,但是客户端拿到掉包的证书后,发现域名不是自己目标服务器的域名,就可以知道证书被掉包了
HTTPS
先前的内容,只是HTTPS的基本原理,也就是使用混合加密 + 证书的模式,实际上HTTPS的流程还要稍微复杂一点,不过基于前面的内容也很好理解了。
SSL/TSL
HTTPS的加密部分,是由SSL/TSL协议完成的,具体关系在下一个小标题会讲解。
先前的混合加密 + 证书的模式中,对称密钥C完全由客户端生成,服务端完全没有参与这个过程,而在真正的SSL/TSL协议中,这个对称密钥是由双方进行协商得出的。
HTTPS通信流程:

首先,客户端要与服务端建立TCP连接,随后正式开始HTTPS协议。
- 客户端发送一个
Client Random随机数,这个随机数与后文的密钥相关,并发送一些其它的客户端本身的信息 - 服务端返回一个
Server Random随机数,也与后文的密钥相关 - 服务端发送自己的证书
- 服务端发送一个密钥交换算法,以及这个算法的一些相关参数
- 发送
Hello Done报文,表示结束
这个密钥交换算法有很多种,此处为ECDHE算法。
- 正式开始加密:

客户端首先验证证书的可靠性,在这个证书中包含服务端的公钥S。随后给服务端也发送一个ECDHE的参数,并且这个报文由S公钥进行加密。
此处不对ECDHE算法深入了解,只需要知道客户端与服务端会交换这个算法的部分参数。
当客户端与服务端拿到了ECDHE算法的参数,以及两个随机数Client Random和Server Random,就开始正式生成密钥。
- 双方分别基于
ECDHE算法,生成预主密钥Pre-Master,由于先前已经交换过参数,它们计算出的值是相同的 - 双方分别基于
Client Random和Server Random,对预主密钥Pre-Master进行再次计算,得到主密钥master secret
这个主密钥master secret又会进一步生成会话密钥session secret。
随后客户端发送Change Clipher Spec报文,表示接下来的报文将使用会话密钥session secret加密。随后立刻发送Fished报文,这个报文也会被session secret加密,在这个报文内部,包含了客户端之前各种信息形成的哈希值。
服务端ACK确认该报文后,正式开始通信,当服务端第一次发送数据之前,也会发送发送Change Clipher Spec报文,表示接下来的报文将使用会话密钥session secret加密,再发送一个Fished报文,也包含了服务端之前各种信息生成的哈希值。
当双方的Finded报文都发送完毕后,就可以互相知道对方的哈希值,从而对比出之前是否有数据不统一,如果这两个哈希值一样,那么生成的session secret就是一样的。
最后正式开始HTTPS通信。
- 总结
在以上过程中,麻烦的是双方要互相交换很多数据,最终的sesson secret密钥,是一个对称密钥,但是这个密钥是由双方一起决定的,不再是客户端独自生成。
如果忽略复杂的密钥生成过程,可以直接简化为最初的混合加密 + 证书的模型,最后还是维护了一个对称密钥实现数据加密。只不过这个经过这个生成密钥的过程,最终的对称密钥安全性更高。
此处得到对称密钥的方式有很多种,本博客只是讲解了其中一种ECDHE,也没有细讲该算法内部的具体内容。
HTTPS
HTTP、HTTPS、SSL、TLS协议关系如下:

其实HTTPS协议就是在HTTP协议基础上增加了一个加密层,而加密是由SSL或TLS实现的,其中SSL是TLS的前身。
所以上一个小标题叫做SSL/TLS,这表示加密部分是由这两个协议实现的,并且两者是or的关系。
相关文章:
Linux网络:HTTPS协议
Linux网络:HTTPS协议 加密方式对称加密非对称加密混合加密中间人攻击 证书数据签名CA认证 HTTPSSSL/TSLHTTPS 在HTTP协议中,所有的数据都采用明文的形式传输,这就会导致数据非常容易泄露,只要拿到HTTP报文,就可以窃取各…...
http常⻅请求头和响应头详细讲解(笔记)
http常⻅请求头状态码 简介:讲解http常⻅见的请求⽅方法和使⽤用 http1.0定义了了三种:GET: 向服务器器获取资源,⽐比如常⻅见的查询请求POST: 向服务器器提交数据⽽而发送的请求Head: 和get类似,返回的响应中没有具体的内容&am…...
【c++丨STL】list的使用
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 list简介 一、list的默认成员函数 构造函数(constructor) 析构函数 赋值重载 二、list的迭代器接口 迭代器的功能分类 三、list的容量…...
系统掌握大语言模型提示词 - 从理论到实践
以下是我目前的一些主要个人标签: 6 年多头部大厂软件开发经验;1 年多 AI 业务应用经验,拥有丰富的业务提示词调优经验和模型微调经验。信仰 AGI,已经将 AI 通过自定义 Chatbot /搭建 Agent 融合到我的工作流中。头部大厂技术大学…...
cocosCreator视频web模式播放踩坑解决
/*** 对外输出接口*/ export interface VideoPlayerManageInterface {//初始化视频播放器init(list: VideoPlayerManageInitListType[],options?: VideoPlayerManageInitOptionsType): Promise<void>;//播放视频play(url: string, currentTime?: number): Promise<v…...
c++头文件中 #ifndef的作用
避免文件重复处理、变量等重定义 //c1.hpp #ifndef C1_HPP #define C1_HPP int a 0; #endif // LFU_CACHE_HPP#include"c1.hpp" #ifndef C2_HPP #define C2_HPP int b1; #endif#include"c1.hpp" #include"c2.hpp" #include<iostream> in…...
Xcode 项目内 OC 混编 Python,调用 Python 函数,并获取返回值(基于 python 的 c函数库)
1:新建 Xcode 工程 2:工程添加 Python.framework 1597052861430.jpg 3:在当前工程下新建一个名字为 googleT 的 python 文件(googleT.py) 1597052584962.jpg 在 googleT.py 文件内写入一个测试 python 函数 def lgf_translate( str ):var1 Hello World!print (str var1)retu…...
每日计划-1117
1. 完成 169. 多数元素 class Solution { public:int majorityElement(vector<int>& nums) {// 使用哈希表来统计每个元素出现的次数unordered_map<int, int> countMap;int n nums.size();for (int num : nums) {// 如果元素已经在哈希表中,增加其…...
如何用GPT-4o解读视频
OpenAI在去年推出的GPT-4V已经支持了多模态识别,但一直仅限于图片输入,不支持视频。相比之下,Google的Gemini早已支持视频识别。最近,我司业务场景中出现了一个需要识别视频的需求,而我们只采购了GPT-4o模型。这就引发…...
[ACTF2020]Upload 1--详细解析
信息收集 题目告诉我们是一道upload,也就是文件上传漏洞题目。 进入界面,是一个灯泡,将鼠标放在图标上就会出现文件上传的相应位置: 思路 文件上传漏洞,先看看有没有前端校验。 在js源码中找到了前端校验ÿ…...
【微软:多模态基础模型】(3)视觉生成
欢迎关注【youcans的AGI学习笔记】原创作品 【微软:多模态基础模型】(1)从专家到通用助手 【微软:多模态基础模型】(2)视觉理解 【微软:多模态基础模型】(3)视觉生成 【微…...
整合Druid
添加依赖 配置数据源信息...
基于Python空气质量可视化及预测
摘 要 随着社会的发展和工业化进程的加速,环境问题日益凸显,尤其是空气质量问题对人们的生活和健康产生了重大影响。为了更好地了解和预测空气质量,本文设计并实现了一个基于Python爬虫、Flask框架和ECharts的天气质量预测及可视化系统。该系统通过爬取网络上的空气质量数据…...
第1章-PostgreSQL(PG)介绍
第1章-PostgreSQL(PG)介绍 1、简介2、排名3、发展4、应用5、优势6、对比 1、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版…...
moduo之阻塞队列BlockingQueue和BoundedBlockingQueue
简介 moduo中的队列与java线程池中的队列类似, 有无界阻塞队列和有界阻塞队列 结构 #mermaid-svg-Gf8nET825tZgzVRM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Gf8nET825tZgzVRM .error-icon{fill…...
大模型Tuning方法详解
1. 引言 大模型与Tuning的重要性 随着人工智能和深度学习技术的快速发展,大规模预训练模型(Large Pre-trained Models,简称大模型)在自然语言处理、计算机视觉等领域取得了显著的效果。大模型如GPT-4、BERT、T5和DALL-E等具备强…...
爬虫策略与反爬机制——爬虫常见策略
随着网络爬虫技术的日益发展,反爬机制也变得越来越复杂,网站和服务商不断加强对爬虫行为的监控和限制,开发者需要采取一系列有效的爬虫策略来提高爬虫的效率并规避反爬措施。本章将介绍一些常见的爬虫策略,帮助开发者应对不同情况…...
Linux基础(十七)——Linux 帐号管理与 ACL 权限设置
Linux 帐号管理与 ACL 权限设置 1.UID与GID2./etc/passwd3./etc/shadow4./etc/group5./etc/gshadow6.有效群组和初始群组7.账号管理7.1 增加、修改、删除账户7.2 增加、修改、删除群组7.3 实例 8.ACL使用8.1 ACL定义8.2 查询与设置ACL 9.用户切换9.1 su9.2 .sudo 10. 使用者的特…...
【HarmonyOS】鸿蒙系统在租房项目中的项目实战(二)
从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...
11.16 Vue element
Ajax 概念:Asynchronous JavaScript Anderson XML,异步的JavaScript和XML。 作用: 数据交换:通过Ajax 可以给服务器发送请求,并收取服务器相应的数据。异步交互:可以在不重新加载整个页面的情况下&#…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
