HTTPS加密原理深度解析
从对称/非对称加密到 TLS 1.3 握手,一文讲清 HTTPS 如何保护你的数据。
一句话概括
HTTPS = HTTP + TLS。TLS 握手阶段用非对称加密安全交换密钥,之后用对称加密高效传输数据——前向安全性确保即使私钥泄露,历史会话也无法解密。2026 年全球 Top 100 万网站 HTTPS 覆盖率超 97%。
核心知识点
1. 对称加密 vs 非对称加密
对称加密:加解密用同一把钥匙,速度快(AES-256-GCM),适合传大量数据。问题:怎么把钥匙安全交给对方?
非对称加密:公钥加密,私钥解密,不需要事先共享钥匙。问题:运算慢(比对称慢 100-1000 倍),不能拿来传大文件。
HTTPS 的方案:握手阶段用非对称(ECDHE)协商出一把对称密钥,之后全程对称加密。
1
2
3
4
5
6
7
8
9
const crypto = require('node:crypto');
// 对称: AES-256-GCM(HTTPS 传数据用的)
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(12);
const cipher = crypto.createCipheriv('aes-256-gcm', key, iv);
let enc = cipher.update('转账金额: 5000', 'utf8', 'hex');
enc += cipher.final('hex');
console.log('密文:', enc, '| 长度:', enc.length); // 密文很短,速度极快
2. TLS 1.3 握手:1-RTT 就搞定
TLS 1.2 握手要 2 RTT(ClientHello → ServerHello+证书 → 客户端发密钥 → 完成)。TLS 1.3 砍掉了多余往返:
1
2
3
4
Client → Server: ClientHello (支持版本+密码套件+DH公钥) ← 一步带齐
Server → Client: ServerHello (选定套件+DH公钥+证书+Finished)
// 此时双方都已算出会话密钥,握手结束!
Client → Server: Finished + HTTP 请求(已加密)
TLS 1.3 相比 1.2 删掉了 RSA 密钥交换(没有前向安全)、RC4、CBC 模式、3DES,只保留 5 个 AEAD 套件。
3. 前向安全性:私钥泄露也不怕
如果握手用 RSA(客户端用服务器公钥加密预主密钥发过去),攻击者录下流量,等私钥泄露后就能解密所有历史会话。ECDHE 解决了这个问题:
1
2
3
4
5
6
// 每次会话生成临时 DH 密钥对,用完丢弃
const session = crypto.createECDH('prime256v1');
session.generateKeys();
const pubKey = session.getPublicKey('hex');
// 与对端交换 pubKey 后 computeSecret() 算出共享密钥
// 会话结束 → 临时私钥消失 → 历史数据无法解密 ✅
TLS 1.3 强制 ECDHE,所以默认前向安全。
4. 证书链:浏览器怎么确认”你就是你”
浏览器访问 https://www.example.com 时,服务器返回的不是一张证书,是一条链:
1
2
3
根 CA(内置在操作系统/浏览器,如 DigiCert)
└─ 中间 CA(Let's Encrypt R3)
└─ 服务器证书(www.example.com)
验证 6 步:数字签名验证 → 有效期检查 → 域名匹配(SAN) → 吊销状态(OCSP) → 密钥用法 → 路径约束。任何一步失败 → 浏览器红色警告。
5. AEAD:加密 + 完整性一个都不少
TLS 1.3 只用 AEAD(如 AES-256-GCM),加密的同时生成认证标签(authTag)。篡改密文的任何一位,解密时 authTag 不匹配直接报错。GCM 模式还自带防重放:每个记录的 nonce = 序列号 XOR 固定 IV,重放旧包 nonce 对不上自动丢弃。
其实你每天都在用
- 手机银行/支付宝:转账走 TLS 1.3 + ECDHE,即使你在公共 Wi-Fi 上也没人能偷看密码
- Chrome 地址栏的🔒:点开能看到证书链、加密算法、有效期——TLS 1.3 下还能看到 “X25519” 密钥交换
- Let’s Encrypt 免费证书:已签发 40 亿+ 张,你访问的大部分个人博客、小型网站都靠它
- 微信小程序:强制 HTTPS,连开发调试都需要合法证书
- npm install / pip install:包管理器的下载链接全部 HTTPS,防止中间人篡改包内容注入恶意代码
常见误解(FAQ)
❌ 误区一:”HTTPS 就是 HTTP 外面套了个加密壳,数据绝对安全”
HTTPS 保护的是传输链路,不保护端点。服务器被攻破、客户端中木马、中间人安装恶意CA证书,HTTPS 都防不了。它是传输安全的底线,不是万能保险。
❌ 误区二:”非对称加密比对称加密更安全”
不是”更安全”,是适用场景不同。非对称解决密钥分发问题,对称解决传输效率问题。实际上 RSA-2048 和 AES-128 安全强度接近,没有谁比谁”更安全”。而且非对称加密如果直接用 RSA 做密钥交换反而没有前向安全。
❌ 误区三:”TLS 握手很慢,影响首屏”
TLS 1.3 握手只需 1-RTT(TLS 1.2 要 2-RTT),加上 TCP 的三次握手总计 2 RTT。而且会话复用(Session Ticket/ID)可以跳过完整握手。实际测试中,一次典型的 HTTPS 连接建立约 50-150ms,远小于 DNS 解析和页面渲染时间。
❌ 误区四:”自签名证书和 CA 签发的差不多”
自签名证书没有任何可信第三方背书,浏览器会弹红色警告。攻击者可以伪造一张相同域名的自签名证书,浏览器无法区分谁是真谁是假。CA 签发证书有严格的域名验证(DV/OV/EV),而且公共 CA 如果乱签会被从根证书列表中移除。
一句话总结
HTTPS 不是”把 HTTP 加密一下”那么简单——它用证书链解决身份验证,用 ECDHE 保证前向安全,用 AEAD 同时保障机密性和完整性,是一套精心设计的多层防御体系。理解它不是为了面试背答案,而是让你在配置 nginx、调试网络问题时知道每一步在干什么。