5 月份一篇文章都没有发,原因无他,就是太累了,精神上在不停地内耗,所以,想休息一阵子。
昨天突发奇想,对 https 的具体原理产生了兴趣,就在网上搜了一些文章来看。但这些文章水平比较层次,很多都存在不能自恰的地方,最终我不得不求助 AI。
我用了 oppo 自带的小布助手(本质上还是 deepseek),觉得它讲得还挺不错,就拿它当例子,给大家讲讲。
HTTPS 的加密流程可以比喻为「快递员送加密保险箱」,整个过程分为 建立安全通道 和 加密传输数据 两大阶段。以下是通俗版的完整流程:
第一阶段:建立安全通道(TLS 握手)
目标:快递员(客户端)和收件方(服务器)协商出一个只有双方知道的「临时密码」,后续用它加密数据。
步骤 1:客户端打招呼
- 客户端(比如浏览器)对服务器说:
“你好,我想用 HTTPS 通信,支持这些加密算法(比如 AES、RSA),这是我的随机数 Client Random。”
(浏览器发送支持的加密协议版本、加密算法列表、客户端随机数)
步骤 2:服务器回应并出示「身份证」
- 服务器回应:
“好的,我们选 AES_256 + RSA 加密,这是我的随机数 Server Random,还有我的 SSL 证书(含公钥)和证书签名。”
(服务器发送选定的加密算法、服务器随机数、SSL 证书)
步骤 3:客户端验证证书
- 关键点:客户端检查证书是否可信:
- 证书是否由权威机构(如 Let’s Encrypt、DigiCert)颁发?
- 证书是否过期?
- 证书中的域名是否和访问的网站一致?
(若证书有问题,浏览器会弹出警告⚠️)
步骤 4:生成「临时密码」
- 客户端用服务器公钥加密一个 Pre-Master Secret(第三个随机数),发给服务器。
- 服务器用私钥解密,得到 Pre-Master Secret。
- 客户端和服务器各自用 Client Random + Server Random + Pre-Master Secret,生成相同的 Master Secret(主密钥)。
- 最终:用 Master Secret 生成对称加密的「会话密钥」(Session Key),后续用它加密数据。
第二阶段:加密传输数据
目标:用协商好的「会话密钥」加密所有通信内容。
步骤 5:客户端通知加密就绪
- 客户端说:“我这边准备好了,之后都用会话密钥加密!”
(发送加密完成的提示,并附带校验码)
步骤 6:服务器确认加密就绪
- 服务器回应:“我也准备好了,开始加密传输吧!”
(同样发送加密完成的提示和校验码)
步骤 7:正式加密通信
- 双方用「会话密钥」对称加密数据(如 AES 算法),传输内容全部变成乱码。
- 对称加密优势:计算速度快,适合高频数据传输。
流程总结(快递员送保险箱版)
- 协商规则:客户端和服务器交换三个随机数,生成唯一「保险箱密码」。
- 验证身份:服务器出示 SSL 证书(类似营业执照),客户端验证真伪。
- 传递密码:客户端用服务器的公钥加密「保险箱密码」,传给服务器。
- 开箱加密:双方用同一密码锁住数据,快递员(中间人)即使截获也打不开。
关键技术点
- 混合加密:
- 非对称加密(RSA)传递密钥(安全但慢)
- 对称加密(AES)加密数据(快但需共享密钥)
- 证书防伪:
SSL 证书由 CA 机构签名,伪造证书会被浏览器识别(如山寨银行网站)。 - 前向保密:
每次会话的「临时密码」不同,即使某次密码泄露,历史数据仍安全。
举个实际例子:
当你在浏览器输入 https://www.taobao.com
:
- 淘宝服务器返回 SSL 证书,浏览器验证证书有效。
- 双方协商出本次会话的加密密钥。
- 你输入的账号、密码、商品信息全部加密传输,即使被黑客截获也无法解密。
网络教程比较模糊的一点就是,传输数据的时候,两边具体是怎么加解密的?如果仅用公钥私钥的话,这两种密钥同样存在被截获的可能呀?
小布助手说,最终是客户端和服务端通过已经传递的信息计算出了相同的密钥,然后双方使用这个密钥进行加密传输,避免了网络上的攻击。
最终效果:HTTPS = HTTP 明文传输 + TLS 加密层,像给数据穿上了防弹衣!🔒