TLS加密套件详解:密钥交换算法、认证算法、对称加密、哈希算法、常见套件分析
加密套件,说白了就是TLS握手时双方协商的一套“加密工具包”。服务端和客户端必须用同一套工具才能安全通信。我记得刚入行时,看到一串像 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 这样的名字,头都大了。后来拆开看,其实就四个部分:密钥交换、认证、对称加密、哈希。今天咱们一个一个啃。
1. 密钥交换算法
密钥交换的任务是让双方安全地协商出对称加密用的会话密钥。主流的算法有 RSA、DH、ECDH、DHE、ECDHE。我个人习惯把它们分成两类:静态交换(RSA)和前向安全交换(DHE/ECDHE)。静态交换一旦私钥泄漏,过去所有会话密钥都会被破解。我在项目中就遇到过这样的事故——客户服务器用的RSA密钥交换,半年后证书被偷,所有历史流量都得回放分析,特别惨。
| 算法 | 安全等级 | 前向安全 | 性能 |
|---|---|---|---|
| RSA | 中等 | 否 | 快 |
| DH | 中等 | 是(参数临时) | 较慢 |
| ECDH | 高 | 是(临时) | 快 |
| DHE | 高 | 是 | 较慢 |
| ECDHE | 高 | 是 | 快 |
2. 认证算法
认证环节说白了就是验证服务端(或客户端)的身份。常用的是 RSA 签名和 ECDSA 签名。RSA 签名兼容性好,几乎所有服务端都支持。但 ECDSA 签名更短、性能更好,适合 IoT 和移动设备。我建议:如果你控制客户端环境,优先用 ECDSA;如果兼容性要求高,用 RSA。
这里有个坑:证书里的公钥类型必须和握手时选择的认证算法匹配。比如你配了 ECDHE_ECDSA 的套件,但服务器证书是 RSA 公钥,握手会直接失败。我踩过这个雷,检查了大半天才发现是证书类型选错了。
3. 对称加密算法
密钥交换和认证搞定后,真正的数据加密用对称算法。目前最安全的是 AES 和 ChaCha20。AES 有硬件加速,服务器上用得多;ChaCha20 在移动端更省电。加密模式这块我特别想强调:千万别用 CBC 模式,它容易受 padding oracle 攻击。我在内部安全审计时,发现好几个业务还配着 AES_128_CBC,赶紧让他们换成了 GCM 或 ChaCha20-Poly1305。
| 算法 | 密钥长度 | 推荐模式 | 安全性 |
|---|---|---|---|
| AES | 128 / 256 | GCM / CCM | 高 |
| ChaCha20 | 256 | Poly1305 | 高 |
| 3DES | 168 | CBC | 低(已弃用) |
4. 哈希算法
哈希算法主要用于消息认证码(HMAC)和伪随机函数(PRF)。TLS 1.2 里常用 SHA-256、SHA-384。SHA-1 虽然曾经很流行,但已经被撞库攻击打穿了。我以前做过一个渗透测试项目,目标服务端还在用 SHA-1 签名的证书,我直接生成一个相同哈希的不同证书就骗过了浏览器…所以说,SHA-1 不能再用了。TLS 1.3 已经移除了 SHA-1 的支持,这是个正确方向。
5. 常见套件分析
讲了这么多理论,咱们来看几个真实世界中常见的套件。我整理了下面的表格,方便你快速对照。
| 套件名称 | 密钥交换 | 认证 | 对称加密 | 哈希 | 安全评级 |
|---|---|---|---|---|---|
| TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 | ECDHE | RSA | AES-128-GCM | SHA-256 | 高(推荐) |
| TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 | ECDHE | ECDSA | AES-256-GCM | SHA-384 | 极高 |
| TLS_RSA_WITH_AES_128_CBC_SHA | RSA | RSA | AES-128-CBC | SHA-1 | 低(不推荐) |
| TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 | DHE | RSA | AES-256-GCM | SHA-384 | 高(但速度稍慢) |
我建议线上服务至少保留前两个套件,禁用所有带 CBC 和 SHA-1 的项。实际项目中我还会检查客户端是否支持 CHACHA20-POLY1305,如果支持就把它排在 AES 前面,因为它在无硬件加速环境下更快。
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;6. 核心结构一览
下面这张图把这些要素串了起来。你可以看到每个加密套件其实就是从这四个维度里各选一个算法拼起来。
别小看这个结构,实际抓包分析时,你只要看到套件字符串就能快速判断安全等级。要是见到 RSA_WITH_AES_128_CBC_SHA,基本就是高危信号。我一般在Wireshark里过滤 tls.handshake.ciphersuite,一眼就能扫出问题。
好了,加密套件这块咱们就拆完了。你下次再看到那串又长又怪的字符串,心里应该有底了——无非是这四个维度的排列组合。选对套件,TLS安全就成功了一半。