VPN 的加密和认证是怎么做的?对称加密、非对称加密、密钥交换各扮演什么角色?
简化版
VPN 的安全靠三样东西配合:对称加密、非对称加密(+密钥交换)、身份认证,各司其职。① 对称加密(如 AES、ChaCha20)负责加密真正的大量数据流量——因为它快、开销小,适合持续传输;② 密钥交换(如 Diffie-Hellman)+ 非对称加密负责在不安全的公网上安全地协商出那把对称密钥——双方在谁都没见过面、通道还不安全的情况下,用 DH 算法各自算出同一个密钥,中间人偷看也算不出来;③ 身份认证(证书 / 预共享密钥 PSK / 公钥)负责确认对端是可信的、不是冒充的中间人,防止「密钥是和攻击者协商的」。此外还有完整性校验(HMAC 等) 保证数据没被篡改。归结起来就是:非对称/DH 负责安全地「交钥匙」,对称加密负责用钥匙高速「锁数据」,认证负责确认「交钥匙的对象是不是本人」。
详细版
一、三种密码学工具的分工
| 工具 | 在 VPN 里干什么 | 为什么用它 |
|---|---|---|
| 对称加密(AES、ChaCha20) | 加密实际传输的数据 | 快、适合大量数据 |
| 密钥交换(DH/ECDH) | 双方安全协商出对称密钥 | 不用传密钥本身也能各自算出同一把钥匙 |
| 非对称加密 / 数字签名(RSA、ECDSA、证书) | 身份认证、保护密钥协商过程 | 公私钥能验证身份、防中间人 |
| 哈希 / HMAC | 完整性校验、防篡改、防重放 | 检测数据是否被改动 |
二、为什么不能只用对称加密
对称加密快,但有个死结:加解密用同一把密钥,这把密钥怎么安全地让双方都拿到? 直接在公网上传密钥,会被截获。所以需要一种「不传密钥、双方却能得到同一把密钥」的办法——这就是密钥交换(DH)。
三、为什么不能只用非对称加密
非对称加密(公钥加密、私钥解密)能解决密钥分发和身份问题,但它慢、开销大,不适合加密海量数据流量。所以只用它来保护密钥协商和做身份认证,真正的数据加密交给对称加密。
四、密钥交换:Diffie-Hellman 的魔法
DH 让双方在公开信道上,各自保留一个私密值、交换一些公开值,最后各自独立算出同一个共享密钥,而窃听者即使看到所有公开交换的内容,也算不出这个密钥。这样对称密钥就安全地「凭空」在两端诞生了,无需传输密钥本身。
五、身份认证:防中间人
密钥交换本身不验证「对面是谁」。如果不认证,攻击者可以站中间,分别和你、和真服务器各做一次 DH(中间人攻击)。所以要用证书 / 预共享密钥 / 公钥认证对端身份,确认「我协商密钥的对象确实是可信端点」。
完整版教学
一、VPN 安全的三个目标
VPN 要在不可信的公网上保证通信安全,实际要满足三个目标,对应不同的密码学工具:
- 机密性(别人看不懂):内容被加密 → 靠加密算法。
- 身份可信(对面是真的,不是冒充):确认端点身份 → 靠认证。
- 完整性(没被篡改)+ 防重放:数据没被改、旧包不能重放 → 靠哈希/HMAC + 序号。
理解 VPN 加密,本质是理解**「这几个目标各用什么工具、为什么这么搭配」**。
二、对称加密:干「加密数据」的重活
对称加密(加密和解密用同一把密钥),代表算法 AES、ChaCha20。它的特点是速度快、开销小,非常适合加密持续的大量数据流量。VPN 隧道里跑的所有实际业务数据,都是用对称加密来保护的。
但对称加密有个根本难题——密钥分发:既然双方要用同一把密钥,那这把密钥怎么让远隔千里、素未谋面、通道还不安全的双方都安全地拥有?直接在公网上发送密钥,等于把钥匙和锁一起寄出去,会被截获。这个难题必须交给别的工具解决。
三、密钥交换(DH):不传密钥也能共享密钥
解决密钥分发的关键是 Diffie-Hellman(DH)密钥交换(及其椭圆曲线版 ECDH)。它的神奇之处:双方在完全公开的信道上交换一些信息,就能各自独立算出同一个共享密钥,而窃听者看到全部交换内容也算不出来。
直观理解(调色比喻):
① 双方公开约定一个「公共颜色」(公开参数)。
② A 私藏一个「秘密颜色」,B 也私藏一个「秘密颜色」(各自的私钥,不公开)。
③ A 把「公共色 + 自己的秘密色」混合成一个颜色,公开发给 B;B 同理发给 A。
—— 混合后的颜色很难被逆推出原来的秘密色。
④ A 收到 B 的混合色,再加进自己的秘密色;B 收到 A 的混合色,也加进自己的秘密色。
—— 两边最终得到【同一个】混合色 = 共享密钥!
⑤ 窃听者只看到「公共色」和两个「混合色」,无法还原出任一方的秘密色,
因此算不出最终的共享密钥。
于是对称密钥在两端「凭空」同时诞生,从未在网络上传输过——完美解决了对称加密的密钥分发难题。IPSec 的 IKE、WireGuard、TLS 都用 DH/ECDH 来协商会话密钥。
加分点:每次会话用临时 DH 密钥(DHE/ECDHE)能实现前向保密(PFS)——即使某次长期私钥泄露,也无法解密之前录下的历史流量。
四、非对称加密与认证:确认「交钥匙的是本人」
DH 能安全地协商出密钥,但它不解决「对面到底是谁」。这就留下一个大洞——中间人攻击(MITM):
你 ←DH→ 攻击者 ←DH→ 真服务器
攻击者站中间,分别和你、和真服务器各做一次 DH,你以为在和服务器协商,其实密钥是和攻击者协商的,攻击者能解密、篡改一切。
要堵住这个洞,必须认证对端身份,手段是非对称密码学:
- 数字证书 / 数字签名(RSA、ECDSA):对端用私钥签名证明「我持有这个身份对应的私钥」,你用它的公钥/证书验证。证书由可信 CA 背书,确认公钥确实属于声称的那个身份。
- 预共享密钥(PSK):双方事先安全地共享一个秘密,用它证明彼此身份(适合站点固定的场景,如两个 VPN 网关)。
- 公钥登记(如 WireGuard):每个节点用公私钥,事先互相登记信任的公钥,能用对应私钥完成握手就证明身份。
认证和 DH 结合:在 DH 协商时用签名/PSK 绑定身份,确认「我协商密钥的对象确实是可信端点」,中间人就无法冒充。
五、完整性与防重放:HMAC 和序号
加密解决了「看不懂」,但没解决「被改」和「被重放」:
- 完整性:用 HMAC(带密钥的哈希)或 AEAD 加密算法(如 AES-GCM、ChaCha20-Poly1305,加密和认证一体)给每个包附上校验值,对端一验就知道数据有没有被篡改——改一个比特都能发现。
- 防重放:给包加序号,对端拒收重复或过期的序号,防止攻击者录下旧包重放(如重放一个「转账」包)。
IPSec 的 ESP、WireGuard 等都内建了完整性校验和防重放序号。
六、把它们串起来:一次 VPN 握手的密码学全景
以典型 VPN 建立过程为例:
① 认证 + 密钥协商:
双方用【证书/PSK/公钥】互相【认证身份】(非对称密码学),
同时用【DH/ECDH】安全协商出一把【对称会话密钥】。
—— 认证防中间人,DH 安全交钥匙。
② 数据传输:
之后所有业务数据用【对称加密(AES/ChaCha20)】加密(快),
每个包带【HMAC/AEAD 校验】保完整、带【序号】防重放。
—— 对称加密扛大流量,HMAC/序号防篡改防重放。
③ 密钥更新:
定期重新做 DH 协商,更换会话密钥(限制单密钥使用量,配合前向保密)。
这套「非对称/DH 负责安全建立密钥和认证身份 + 对称加密负责高效加密数据」的分工,不只是 VPN,HTTPS/TLS 也是同一套思路——理解一个就理解了一类。
七、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 加密 | 保护机密性,防止内容被窃听 |
| 认证 | 确认对端身份,防止接入假网关或假客户端 |
| 完整性 | 发现报文被篡改或重放 |
handshake:
authenticate peer
negotiate keys
data channel:
encrypt(payload)
attach integrity tag / sequence number
VPN 安全至少要同时说加密、认证、完整性;只说“加密”是不完整答案。
- 误区:VPN 有加密就不需要认证。 没有认证会被中间人冒充网关或客户端,加密对象可能是攻击者。
- 误区:认证只发生在登录页面。 协议握手中也要做设备、证书、密钥或用户身份认证。
- 误区:完整性和加密是一回事。 加密隐藏内容,完整性检测内容是否被篡改,两者目标不同。
- 追问:为什么需要防重放? 攻击者可能复制旧报文再次发送,序列号和窗口校验可识别重复报文。
- 追问:证书认证有什么好处? 可基于 PKI 验证身份,支持吊销、有效期和组织级管理。
- 追问:弱算法有什么风险? 旧加密套件和短密钥可能被破解或降级,应禁用过时算法并定期轮换配置。
八、加强记忆
VPN 安全靠三工具分工:对称加密(AES/ChaCha20) 快,负责加密实际的大量数据;密钥交换 DH/ECDH 负责在公网上安全协商出那把对称密钥(双方各自算出同一密钥、密钥从不传输,窃听者算不出);非对称密码学(证书/签名/PSK/公钥) 负责身份认证、防中间人(DH 自己不验身份,必须靠认证堵住 MITM)。再加 HMAC/AEAD 保完整性、序号防重放。记住这套分工:非对称/DH「安全交钥匙 + 验明正身」,对称加密「用钥匙高速锁数据」——这也正是 HTTPS/TLS 的同一套思路。核心一句:慢而安全的非对称管协商和认证,快的对称管加密数据。