049 HTTPS 协议原理

049 HTTPS 协议原理
小米里的大麦HTTPS 协议原理
先简单回顾一下 TCP/IP 四层模型(视频剩余部分可作为了解):http 和 https 有什么区别吗?(SSL 协议) | B 站。
1. 概念准备
1. HTTPS 是什么?
HTTPS(HyperText Transfer Protocol Secure)是一个 应用层协议,可以理解为是 HTTP 协议的“安全版”。
- 核心区别:在 HTTP 协议的基础上引入了一个 加密层。
- 原因:标准的 HTTP 协议是 明文传输 的,这意味着传输的数据(如账号、密码、个人信息)在经过路由器、运营商等网络设备时,很容易被“劫持”或“篡改”(例如“运营商劫持”下载链接)。
- 目的:通过加密,保证用户的信息安全,防止数据在传输过程中被窃取或篡改。
2. 什么是加密?
- 加密:将要传输的原始信息(称为 明文)通过一系列数学变换,生成一段不可读的、看似随机的文本(称为 密文)的过程。
- 解密:将 密文 通过一系列变换,还原成原始 明文 的过程。
- 密钥:在加密和解密过程中,需要用到一个或多个关键数据,这个数据就叫做 密钥。它是加密算法的核心,决定了加密和解密的具体方式。
3. 为什么要加密?
主要原因是为了应对网络传输中的安全威胁,特别是 中间人攻击(Man-in-the-Middle Attack, 简称 MITM 攻击)。
- 明文传输的风险:HTTP 的明文数据在传输过程中会经过多个物理节点(路由器、运营商等)。任何能接触到这些节点的人都可以 窃取 我们的隐私信息(如登录密码、支付信息),甚至可以 篡改 传输的内容(如将运营商设备篡改下载链接等等)。
- 加密的作用:通过对信息进行加密,即使数据被劫持,黑客看到的也只是无法理解的密文,从而保护了信息的机密性和完整性。
4. 常见的加密方式
下面这些视频我认为讲的非常好,虽然标题各式各样的,但是内容和我们要讲的基本一致,超出的知识就当扩展了,如果后面的文字讲解难懂,建议先看视频 👉:
HTTPS 是什么?原理是什么?用公钥加密为什么不能用公钥解密? | B 站
HTTPS 是什么?加密原理和证书。SSL/TLS 握手过程 | B 站
白话 HTTPS,如何在全世界的眼皮子底下安全密谋? | B 站
https 真安全么? 抓包解密 https 的两种原理+实战 开源软件 mitmproxy 与 wireshark 如何抓包 https | B 站
1. 对称加密
- 原理:使用 同一个密钥 进行加密和解密。这个密钥必须由通信双方共同持有。
- 特点:
- 优点:算法公开、计算量小、加密速度快、效率高。
- 缺点:最大的问题是 密钥的分发。如何安全地把这个“共享密钥”告诉对方?如果通过网络明文传输密钥,那么密钥本身就会被截获,整个加密就形同虚设。
- 常见算法:DES、3DES、AES 等。
- 简单示例:按位异或(XOR)操作。用密钥
key
对明文a
加密得到密文b
(a ^ key = b
),再用同一个密钥key
对密文b
解密就能得到明文a
(b ^ key = a
)。
2. 非对称加密
- 原理:使用 一对 密钥,一个 **公钥 ** 和一个 私钥。公钥和私钥是成对生成的,它们之间有特殊的数学关系。
- 工作方式:
- 用 公钥 加密,只能用对应的 私钥 解密。
- 用 私钥 加密(这通常称为“签名”),只能用对应的 公钥 解密(这通常称为“验证”)。
- 特点:
- 优点:解决了密钥分发问题。公钥可以公开给任何人,而私钥自己严格保密。即使公钥被截获,没有私钥也无法解密。
- 缺点:算法复杂,加密和解密速度比对称加密慢很多。
- 常见算法:RSA、DSA、ECDSA 等。
- 生活中的例子:公钥就像一把 锁,可以公开分发。任何人想给你发秘密文件,就把文件放进盒子并用这把“锁”锁上。只有你拥有对应的“钥匙”(私钥),才能打开盒子取出文件。
3. 数据摘要 && 数据指纹
摘要 就是把 任意长度的数据,通过 Hash 函数 变成一个 定长的“指纹”或“身份证”(对原始数据进行单向哈希运算后得到的一串固定长度的字符串),能用来验证数据完整性;数据指纹类似,也是通过算法提取数据特征,可用于识别和区分不同数据,它们都像数据的独特 “标识”。
数据摘要的特点:
- 不可逆:从摘要推不回原文。
- 雪崩效应:原文哪怕改 1 个字节,摘要都会完全不同。
- 长度固定:无论原文多大,都能快速生成摘要,摘要结果都是固定长度(比如 256 位)。
- 确定性:相同输入 → 相同输出。
- 抗碰撞性:极难找到两个不同内容生成相同摘要(防伪造)。
数据摘要可以理解为:原文 = 一大堆内容,摘要 = “身份证号” 或 “指纹”(唯一标识这个内容,改了就对不上)。
- 原理:利用 单向散列函数(Hash 函数,如 MD5、SHA1、SHA256)对任意长度的数据进行计算,生成一个 固定长度 的、唯一的“数字指纹”或“摘要”。
- 关键特性:
- 定长:无论输入多长,输出的摘要长度是固定的。
- 分散:输入数据哪怕只改变一个比特,生成的摘要也会发生巨大变化。
- 不可逆:无法从摘要反推出原始数据。
- 防碰撞:理论上不同的数据可能产生相同的摘要(碰撞),但概率极低。
- 用途:严格来说,这不是加密,因为它没有解密过程。它主要用于 验证数据的完整性。接收方可以自己计算收到数据的摘要,然后与发送方提供的摘要进行比对。如果一致,说明数据在传输过程中没有被篡改。
4. 数字签名(后面细说)
- 原理:数字签名 = 数据摘要 + 非对称加密。
- 对原始数据(明文)计算一个 数据摘要。
- 使用发送方的 私钥 对这个 摘要 进行加密,得到的结果就是 数字签名。
- 验证过程:
- 接收方收到原始数据和数字签名。
- 用发送方的 公钥 解密数字签名,得到一个摘要值(我们称之为
摘要A
)。 - 接收方自己用相同的哈希算法对收到的原始数据计算摘要(我们称之为
摘要B
)。 - 比较
摘要A
和摘要B
。如果相等,则说明:- 数据完整性:数据未被篡改(因为摘要匹配)。
- 身份认证:签名确实是由持有对应私钥的人生成的(因为只有他的公钥才能成功解密)。
- 作用:数字签名解决了“我是谁”和“内容是否被改过”的问题。
2. HTTPS 的 5 种方案探究
对称加密:加密和解密使用同一个密钥。速度快,适合大量数据加密。
非对称加密:有一对密钥 —— 公钥(可公开)和私钥(必须保密)。公钥加密的数据,只有私钥能解密;私钥签名的数据,公钥可验证。优点:不怕公钥被截获;缺点:速度慢,不适合大数据加密。
中间人攻击(MITM):攻击者在通信双方中间截获、篡改、伪造信息。
方案 1:只使用对称加密
1. 场景
客户端和服务器约定用同一个密钥(比如 “123456”)来加密通信。
2. 密钥如何传输?
必须提前“共享”密钥。比如:客户端和服务器事先约定好密钥(不现实,互联网用户千千万),或者,客户端第一次访问时,服务器“明文发送”密钥给客户端。
3. 风险在哪里?
密钥在传输过程中被截获! 比如:客户端请求:“请给我密钥”,服务器回复:“密钥是 123456” ← 被黑客监听到,之后所有通信,黑客用 123456 解密 → 完全裸奔!
4. 产生的问题
密钥无法安全传递(除非物理见面,不现实),每个用户都要不同密钥?服务器怎么管理?一旦密钥泄露,所有通信都暴露。
就像我们和朋友约好用同一把钥匙开保险箱,但我们必须先把钥匙寄给他 —— 快递员(黑客)偷了钥匙,就能开你的保险箱。
方案 2:只使用非对称加密
1. 场景
服务器有公钥和私钥。客户端用服务器的公钥加密数据,服务器用自己的私钥解密。
2. 密钥如何传输?
服务器把自己的 公钥 发给客户端(公钥不怕被截获)→ 客户端用公钥加密数据 → 服务器用私钥解密。
3. 风险在哪里?
性能问题 + 无法双向加密:
- 性能极差:非对称加密计算量大,传个网页都要几秒,用户体验爆炸。
- 服务器无法加密发给客户端:客户端没有私钥,服务器如果想加密数据发给客户端,必须知道客户端的公钥 —— 但客户端没有公私钥对!如果让客户端也生成公私钥,那就变成方案 3 了。
就像每次寄信都要用特制保险箱(非对称加密),寄一封信要花 10 分钟打包,收件人还要花 10 分钟拆 —— 寄 100 封信?系统崩溃!
方案 3:双方都使用非对称加密
1. 场景
客户端和服务器各自生成自己的公私钥对。互相交换公钥,然后用对方的公钥加密数据发给对方。
2. 密钥如何传输?
客户端生成公私钥,把公钥发给服务器 → 服务器生成公私钥,把公钥发给客户端 → 双方用对方公钥加密,用自己的私钥解密。
3. 风险在哪里?
中间人攻击(MITM)! 黑客可以这样干:
- 客户端 → “我要和服务器通信,请给我公钥”。
- 黑客截获,伪造自己是服务器,把自己的公钥发给客户端。
- 客户端 → 用“假公钥”加密数据 → 黑客收到后用自己的私钥解密 → 再用真服务器的公钥加密转发。
- 服务器 → 回复,黑客同样截获 → 用客户端的假公钥加密再发回去。
客户端和服务器以为在安全通信,其实所有数据都被黑客看到并转发!
4. 产生的问题
- 无法确认“公钥是谁的” —— 公钥被掉包都不知道!
- 性能依然差(非对称加密慢)
- 管理复杂(每个会话都要生成密钥对)
就像我们和朋友交换“加密信箱钥匙”,但快递员偷偷把自己的钥匙塞给我们,说“这是我朋友的”。我寄信给他,他全都能看,再模仿我朋友回信 —— 我们完全被蒙在鼓里!
方案 4:非对称加密 + 对称加密(混合方案)
方案 4 在 TLS 1.2 里常见,但 TLS 1.3 已经弃用。现在都用 ECDHE(椭圆曲线 Diffie-Hellman Ephemeral) 做 密钥协商,这样即使服务器长期私钥泄露,历史流量也解不开(前向保密)。换句话说:对称密钥不是传输过来的,而是双方独立算出来的。
1. 场景
用非对称加密来 安全传递对称密钥,之后用对称密钥加密通信数据。
2. 密钥如何传输?
- 客户端连接服务器,服务器发送自己的 公钥(比如通过证书)
- 客户端生成一个随机的 对称密钥(如 AES 密钥)
- 客户端用服务器的 公钥 加密这个对称密钥 → 发送给服务器
- 服务器用自己的 私钥 解密 → 得到对称密钥
- 之后所有通信,都用这个对称密钥加密/解密!
3. 风险在哪里?
如果公钥是假的,对称密钥就会被黑客截获! 还是中间人攻击:
- 黑客伪造服务器,把自己的公钥发给客户端
- 客户端生成对称密钥,用“假公钥”加密 → 黑客用自己的私钥解密 → 得到真实对称密钥
- 黑客再用真服务器的公钥加密对称密钥发给服务器
- 之后所有通信,黑客都能用对称密钥解密!
问题根源:客户端无法确认收到的公钥是不是真的属于目标服务器!
4. 优缺点
优点:
对称加密快,适合大数据
非对称只用于传密钥,计算量小
缺点:
- 公钥真实性无法保证 → 需要“身份认证”
就像我们用防弹车(非对称加密)把保险箱钥匙(对称密钥)送到朋友家,但送错了地址(假服务器),钥匙被坏人拿到,之后我们寄的所有东西他都能打开!
方案 5(最终方案)非对称加密 + 对称加密 + 数字证书(HTTPS 真实方案)
1. 场景
在方案 4 基础上,加入 数字证书 来验证服务器公钥的真实性!
2. 密钥如何传输?
- 客户端发起 HTTPS 请求 → 服务器返回 数字证书(包含服务器公钥 + 服务器身份信息 + CA 签名)
- 客户端验证证书:
- 用操作系统/浏览器内置的 CA 公钥 验证证书签名是否合法
- 检查证书是否过期、域名是否匹配等 → 如果验证失败,浏览器弹出警告
- 客户端生成随机对称密钥(如 AES-256)
- 客户端用证书里的服务器公钥加密对称密钥 → 发送给服务器
- 服务器用自己的私钥解密 → 得到对称密钥
- 之后所有通信都用对称密钥加密(高效、安全)
3. 如何防御中间人攻击?
数字证书由可信第三方(CA)签名,黑客无法伪造合法证书!黑客即使拦截通信,也无法伪造一个被 CA 签名的证书(除非攻破 CA,极难),客户端会校验证书,发现域名不符或签名无效 → 直接终止连接!
4. 补充安全机制(了解)
- 前向保密(PFS):每次会话生成临时密钥,即使服务器私钥未来泄露,历史会话也无法解密。(通过 ECDHE 等密钥交换算法实现)
- 证书吊销机制(CRL/OCSP):应对私钥泄露或证书被盗用。
5. 小结
方案 | 加密方式 | 密钥传输方式 | 主要风险 | 是否可行 |
---|---|---|---|---|
方案 1 | 对称加密 | 明文传输或预共享 | 密钥被截获 → 全部暴露 | ❌ 不可行 |
方案 2 | 非对称加密 | 公钥公开传输 | 性能差 + 无法双向加密 | ❌ 不实用 |
方案 3 | 双方非对称 | 交换公钥 | 中间人攻击(公钥被替换/掉包) | ❌ 不安全 |
方案 4 | 非对称+对称(混合加密) | 用公钥加密对称密钥 | 中间人攻击(公钥未认证,MITM 截获) | ⚠️ 有漏洞 |
最终方案 | 混合 + 证书 | 用认证公钥加密对称密钥 | 依赖 CA 体系保障(极少数被攻破案例) | ✅ 安全高效 |
之前看到的一个很形象、易理解的比喻:想象你要和朋友安全通信:
- 方案 1:你俩约好用同一把钥匙,但你得先寄给他 → 快递员偷了钥匙 → 完蛋。
- 方案 2:每次说话都用特制密码机,太慢 → 聊两句就卡死。
- 方案 3:你俩交换密码机的“公开使用说明”,但快递员把自己的说明书冒充你朋友的 → 你按他的说明书操作,他在偷听。
- 方案 4:你寄一把普通钥匙,但用朋友的“防伪密码箱”寄 → 但如果“防伪密码箱”是假的(快递员给的),钥匙还是被偷。
- 最终方案:朋友的“防伪密码箱”上有 公安局盖章认证(CA 证书)→ 你一看盖章是真的,才放心寄钥匙 → 安全!
1. 为什么 HTTPS 最终选择这个方案?
- 效率高:对称加密处理海量数据。
- 安全强:非对称加密保护密钥传输。
- 身份可信:CA 证书防止公钥被伪造。
- 可扩展:支持前向保密、吊销、多域名等。
2. 附加:密钥被攻击的几种真实场景
- 私钥泄露(服务器被入侵)→ 攻击者可解密历史通信(除非启用前向保密)。
- CA 被攻破 → 攻击者可签发任意假证书(极罕见,如 DigiNotar 事件)。
- 用户忽略证书警告 → 主动接受假证书 → 中间人攻击成功。
- 弱随机数生成器 → 生成的对称密钥可预测 → 被破解。
6. 理解链 - 承上启下
1. 对 HTTP 进行对称加密,是否能解决数据通信安全的问题?问题是什么?
不能完全解决,核心问题:密钥的分发。
假设客户端和服务器都用同一个对称密钥来加密通信,这确实能防止第三方窃听。但是,这个密钥是如何从服务器安全地传递给客户端的呢?如果在连接建立之初,服务器直接把密钥明文发给客户端,那么中间人(黑客)同样可以截获这个密钥。一旦密钥泄露,后续所有的“加密”通信对中间人来说就等于没有加密。这就陷入了“先有鸡还是先有蛋”的困境:为了安全传输密钥,我们需要一个密钥来加密它,但这个“用来加密密钥的密钥”又该如何安全传输呢?
2. 为何要用非对称加密?
为了解决“密钥分发”问题。
非对称加密的特性(公钥加密,私钥解密)完美地解决了这个问题。服务器可以将自己的 公钥 通过明文的方式发送给客户端。客户端用这个公钥加密一个 对称密钥 后发送给服务器。即使中间人截获了这个加密后的对称密钥,他也无法解密,因为他没有服务器的 私钥。只有服务器能用自己的私钥解密,从而安全地获得对称密钥。
3. 为何不全用非对称加密?
主要原因是性能。
非对称加密的算法非常复杂,其 加密和解密的速度远远慢于对称加密。如果整个 HTTPS 通信过程都使用非对称加密,会极大地消耗服务器和客户端的计算资源,导致网页加载速度变慢,用户体验很差。因此,最佳实践是结合两者:使用非对称加密来安全地 协商 一个临时的对称密钥,然后在后续的大量数据传输中,使用这个对称密钥进行高效加密。这就是 HTTPS 的核心工作原理。
4. CA 签名认证 VS 数字证书 VS 数字签名
数字签名、数字证书、CA 签名认证 这三样东西经常被混在一起说,但它们 不是一个东西,而是三个环环相扣的概念:CA 签名认证 → 产生合法的数字证书 → 证书里面包含数字签名
。
数字签名: 就是“用私钥对一段数据做的签名”,任何人都能用对应的公钥验证签名是否有效。用途: 保证数据没有被篡改(完整性)、保证数据确实是“私钥持有者”发的(身份认证)。简单例子:
- 服务器把自己的公钥信息、域名信息打个包 → 用私钥生成一个签名。
- 客户端用服务器的公钥验证签名,能验证这份数据确实出自服务器本人。
- 类比:数字签名 = 手写签名/盖章。别人可以看到签名,验证是你签的,但没法伪造。
数字证书: 一份“带身份证明的公钥”,里面包含:服务器的公钥、服务器的域名信息(比如
www.google.com
)、有效期、用途等信息、还有一个 数字签名(由 CA 生成的)。- 用途: 客户端拿到证书后,不仅知道“这是公钥”,还知道“这个公钥是属于哪个网站的”,解决了“公钥是谁的”这个问题。
- 类比: 数字证书 = 身份证。身份证上写着你的名字(域名)、照片(公钥),还有公安局的盖章(CA 签名)。
CA 签名认证: 就是证书里的“盖章”部分 —— 证书不是服务器自己随便说“这是我的身份证”,而是交给权威机构(CA,证书颁发机构)去验证,然后 CA 用自己的私钥签名,证明这份证书是真的。
流程:
- 服务器 → 提交公钥 + 域名信息给 CA。
- CA 审核(域名验证、公司验证等)。
- CA 用自己的 私钥 对证书做数字签名。
- 浏览器内置了各大 CA 的 公钥 → 可以验证证书签名是否有效。
用途: 确保证书是真的,不是黑客自己伪造的,确认公钥确实属于
www.xxx.com
。
类比:CA 签名认证 = 公安局给身份证盖章。别人一看章是真的,就知道身份证不是假造的。
3. 关于 HTTPS 的一些扩展和思考
1. CA 签名流程是不是先做摘要?
是的。 CA 在给证书签名时,先对证书内容(域名、公钥、有效期等)做 Hash 得到摘要,再用 CA 私钥加密摘要 → 得到 数字签名 → 把签名 + 原始证书信息一起 发送 给客户端。证书 = 明文信息 + 签名,签名 = 用私钥加密“数据的摘要”。浏览器验证时:先用相同算法对证书内容 hash,再用 CA 公钥解密签名得到摘要,两者对比 → 确认证书没被篡改。
2. 为什么数字签名(如 CA 对证书签名)不直接用私钥加密原始数据(如证书或任意文件),而要先对数据做 Hash 生成摘要,再对摘要进行加密签名?
因为直接用私钥加密原始数据 效率极低 —— 非对称加密计算慢,且受数据长度限制,不适合大文件或频繁操作;而先对数据做 Hash 生成固定长度的“摘要”,再加密摘要,既大幅 提升签名速度,又 保证了安全性。更重要的是,Hash 摘要具备“雪崩效应”和抗篡改性:哪怕原文改动一个字节,摘要也会彻底改变,接收方通过比对摘要即可验证完整性。同时,先 Hash 还能 防御“长度扩展攻击”等密码学漏洞,确保签名机制在各种场景下(如证书、文件、消息)都安全、高效、标准化。
所以标准流程:原文 → Hash(摘要) → 用私钥加密(签名)。客户端验证时:收到原文 & 签名 → 原文重新 Hash → 用公钥解密签名 = 摘要 → 两个摘要比对一致 → 证明原文没改、签名有效。
3. 如何成为中间人(MITM)
1. ARP 欺骗
局域网里,电脑通信需要知道对方的 MAC 地址。ARP(地址解析协议)就是负责“IP ↔ MAC 地址绑定”。漏洞:ARP 没有验证机制,谁说自己是某个 IP 就信。攻击方法:黑客冒充别人:
- 主机 A 想访问主机 B → 先广播“B 的 MAC 地址谁知道?”
- 黑客抢答:“我是 B,我的 MAC 是 xxx”
- 结果 A 把流量都发给黑客,黑客再转发给 B → 黑客变中间人。
就像在班里传纸条,A 想传给 B,黑客插话说“我就是 B,把纸条给我” → 再偷偷看一眼转交给真 B。
2. ICMP 重定向攻击
ICMP 协议里有一种“重定向消息”,路由器可以告诉主机:“嘿,这个目标地址,你应该走另一条更好的路”。漏洞:ICMP 没验证,谁都能发。攻击方法:
- 黑客伪造 ICMP 消息,告诉受害者“要访问外网,请经过我这台路由器”。
- 结果受害者的所有流量都经过黑客机器。
就像问路,路人甲(黑客)冒充警察说“你要去市中心?从我家后门穿过去更快” → 结果你绕进了陷阱。
3. 假 WiFi / 假网站
- 假 WiFi(所谓的钓鱼网络):黑客开个和真 WiFi 同名的热点,用户连上去后,所有流量都经过黑客电脑 → 可以监控/篡改数据。
- 假网站:黑客在局域网或 DNS 劫持,把
www.google.com
映射到自己控制的假服务器 → 用户以为在访问银行,其实是黑客的钓鱼网站。
就像黑客开了一家“假银行”,外观和真的一样,但柜员全是演员,用户输入账号密码就等于都交给了他。本质:中间人就是把流量骗到自己手里,再决定是“只偷听”还是“修改后转发”。
4. HTTPS 中间人(需用户配合或证书漏洞)
原理:伪造 SSL 证书,骗浏览器信任。 操作:黑客作为中间人,拦截 HTTPS 请求 伪造一个“假证书”发给客户端(如自签名或盗用 CA),如果用户点击“继续访问(不安全)”,则攻击成功,防御:浏览器会警告“证书不受信任”,我们用户不点“忽略”就攻不破。