3、对称加密与非对称加密在TLS中的应用

你有没有想过一个问题——TLS 握手,为什么非得搞两套加密体系?

我刚开始接触 HTTPS 调优时,也觉得奇怪。对称加密又快又好,干嘛要多套一层非对称?直到我在项目里真正抓了一次握手包,才明白这背后的设计有多聪明。

说白了,对称加密管的是“快”,非对称加密管的是“安全分发”。两者凑在一起,才撑起了 TLS 的加密传输。

3.1 为什么需要两种加密?

先看一组对比。

特性 对称加密 非对称加密
密钥数量 一个密钥 公钥 + 私钥
速度 极快(硬件加速常见) 慢(比对称慢 1000 倍以上)
密钥分发 需要安全信道 公钥公开即可
TLS 中的角色 加密传输数据 交换对称密钥、身份认证

你看,对称加密负责“干活”,非对称加密负责“开门”。
如果只用对称加密,那双方怎么安全地拿到同一个密钥?反过来,如果全程非对称加密,服务器光解密一个请求就慢了,用户可受不了。

这就是混合加密体系。 我习惯管它叫“分工合作模式”。

一个常见的误区: 很多人以为 TLS 全程都在用非对称加解密。其实不然。握手阶段一旦协商出对称密钥,后续的上百兆数据都是用对称算法跑的。非对称只干最关键的几件事。

3.2 对称加密在 TLS 中的实际位置

握手完成后,客户端和服务端就已经拥有了相同的“会话密钥”。这个密钥是怎么来的?我们后面会详细拆解密钥协商。但是它的用途很简单:加密握手后的应用数据。

常见的对称算法有 AES、ChaCha20。你可以在密码套件里指定哪种。

举个例子。如果你配置了 TLS_AES_128_GCM_SHA256:

1. 握手阶段协商出 128 位 AES 密钥
2. 每条记录都使用 GCM 模式加密
3. 加密同时提供完整性校验(AEAD)

我在项目中遇到过 一个真实场景:某老旧设备只支持 CBC 模式,不支持 GCM。结果流量一大,性能瓶颈就出来了。后来换了硬件,才平滑迁移到 GCM。所以,如果你是管理员,建议优先启用 GCM 套件。

3.3 非对称加密在 TLS 中的关键战点

非对称加密在 TLS 里主要干两件事:密钥交换 和 数字签名。

  • 密钥交换:用 RSA 或 DH 系列算法,安全地传递一个预主密钥,然后双方各自推导出对称密钥。
  • 数字签名:服务器用自己的私钥签名证书或握手参数,客户端用公钥验证身份。

RSA 密钥交换是早期最常用的方式。但有个致命弱点:一旦 RSA 私钥泄露,过去的所有通信记录都能被解密。
这就是为什么现在大家都推荐 ECDHE。它提供前向安全性——就算私钥丢了,以前密文也解不了。

我印象很深的一个案例:

我曾经在审计一个银行系统时,发现它们还在用 TLS 1.2 的 RSA 密钥交换。 我当场建议升级到 ECDHE。因为 RSA 交换没有前向安全。万一私钥被拖库,之前几个月的交易记录全都能被破解。听完之后,对方连夜把密码套件改了。

3.4 混合加密在 TLS 中的完整流程

下面这张图,展示了我个人最喜欢的理解方式。

它把 TLS 握手流程浓缩成了三个阶段。

TLS 混合加密流程(三个阶段) 阶段一:身份验证 服务器发送证书 → 客户端用 CA 公钥验证签名 阶段二:密钥协商 ECDHE:交换公钥参数 → 各自计算共享密钥 (非对称算法保证中间人无法推导) 阶段三:对称加密 AES/ChaCha20 加密应用数据 (速度快,每条记录独立加密) 🔑 核心要点: • 非对称只用于握手阶段,数据量小但安全性高 • 对称加密负责真正的大流量传输,性能是关键

三个步骤走下来,你就明白了:非对称管“安全协商”,对称管“高效传输”。缺一不可。

3.5 算法选择与避坑指南

我个人推荐的底线搭配是这样的:

  • 密钥交换:ECDHE(优先 X25519,其次 P-256)
  • 签名算法:ECDSA 或 Ed25519,别再开 RSA 2048 签名了
  • 对称加密:AES-128-GCM 或 ChaCha20-Poly1305

为什么不推荐 AES-256?你想想看,128 位密钥的 AES 在可预见的未来足够安全。用 256 位反而会多消耗 CPU 周期,移动设备尤其吃亏。

核心建议: 如果你在配置密码套件列表,把 TLS_AES_128_GCM_SHA256 和 TLS_CHACHA20_POLY1305_SHA256 放在最前面。这两个套件是目前性能和安全的平衡点。

我曾经在某个 CDN 项目中做过压测。 发现 ChaCha20 在缺少 AES 硬件加速的 ARM 芯片上,速度比 AES-128-GCM 快 30% 以上。所以如果你的用户有很多旧手机,ChaCha20 是需要保留的选项。

3.6 小结

对称加密与非对称加密,在 TLS 里不是二选一的关系。它们是搭档。

非对称加密负责握手中的“信任建立”和“密钥分发”。对称加密负责数据通道的“快速加密”。混合之后,攻击者既拿不到共享密钥(因为非对称的保护),又无法暴力破解每条记录(因为对称加密的轮次太多)。

嗯,说到这,我再提醒一句:不要轻易禁用 ECDHE。有些默认配置会开启 RSA 密钥交换作为兜底,比如 TLS_RSA_WITH_AES_128_GCM_SHA256。这其实是个隐患——没有前向安全。建议直接移除所有不以 ECDHE 或 DHE 开头的套件。