第4章 加密算法性能对比:选型不是拍脑袋
很多人觉得加密算法性能差不多,选最安全的就完事。说实话,我以前也这么想,直到在生产环境里被坑过一次——部署了全站 RSA 4096 位证书,结果握手延迟直接飙到 300 毫秒,用户反馈超时率飙升。那次之后我学会了一件事:性能对比必须量化,不能靠感觉。
这一章,我带大家跑一遍常见的对称、非对称和哈希算法的性能数据。不整虚的,全是真实 benchmark 的经验值。
4.1 对称加密:AES 与 ChaCha20 的对决
对称加密是 TLS 记录层的主力,负责加密实际传输数据。现在主流就两个:AES-GCM 和 ChaCha20-Poly1305。
AES 有硬件加速(AES-NI 指令集),在 x86 服务器上快得离谱。但换个场景——移动端或 ARM 芯片,AES 软件实现就吃力了。ChaCha20 恰好相反,纯软件实现效率极高,没有硬件依赖。
我个人习惯用这个原则选:服务器用 AES-GCM,因为它有硬件加速;移动端或物联网设备优先考虑 ChaCha20-Poly1305。
来个典型 benchmark 数据(单位:MB/s,加密 1MB 数据):
| 算法 | x86 (AES-NI) | ARM Cortex-A72 | 说明 |
|---|---|---|---|
| AES-128-GCM | 3200 | 450 | 硬件加速优势明显 |
| AES-256-GCM | 1200 | 230 | 密钥膨胀导致性能折半 |
| ChaCha20-Poly1305 | 780 | 680 | ARM 下反超 AES |
我在项目中遇到过一台老款云服务器没有 AES-NI,当时手一抖配了 AES-256-GCM,结果 CPU 直接 90%。改成 ChaCha20 后,CPU 掉到 30%。
4.2 非对称加密:RSA 太老了,换吧
非对称加密在 TLS 握手阶段做密钥交换和身份认证。RSA 用了二十年,但性能确实跟不上时代。ECDSA 和 Ed25519 是更好的选择。
RSA 密钥越长越安全,但也越慢。2048 位签名还能忍,4096 位纯属自虐。ECDSA 用椭圆曲线,同样安全强度下密钥更短、运算更快。Ed25519 是 Edwards 曲线的一种,签名和验证都快得离谱,而且抗侧信道攻击。
来看看签名速度对比(单位:签名/秒):
| 算法 | 签名速度 | 验证速度 | 密钥长度 |
|---|---|---|---|
| RSA 2048 | 490 | 15500 | 2048 bit |
| RSA 4096 | 100 | 4200 | 4096 bit |
| ECDSA P-256 | 6000 | 3000 | 256 bit |
| Ed25519 | 18000 | 9000 | 256 bit |
有一次我把服务器证书换成 Ed25519,结果 Openssl 1.0 不认,客户端全部握手失败。你想想看,那时候我冷汗都出来了。升级到 1.1.1 以上才解决。记住:选 Ed25519 前先确认客户端库版本。
4.3 哈希算法:别踩 SHA-1 的坑
哈希算法在 TLS 里用于证书签名、MAC 计算、密钥派生。SHA-1 早该埋进历史垃圾堆了。SHA-256 是目前的最低门槛。如果你需要更快,试试 BLAKE2。
哈希速度数据(单位:MB/s):
| 算法 | 速度 | 安全强度 | 常见用途 |
|---|---|---|---|
| SHA-1 | 650 | 已攻破 | 别再用 |
| SHA-256 | 350 | 强 | 证书签名、TLS 1.2 MAC |
| SHA-384 | 270 | 更强 | Suite B 国密替代方案 |
| BLAKE2b | 1050 | 强 | 快速哈希场景 |
我在审计过的一份旧代码里发现了 SHA-1 签名校验,还标着“为了兼容性”。其实市面上所有主流浏览器在 2017 年就不再信任 SHA-1 证书了。兼容个鬼,赶紧升级。
4.4 综合对比:TLS 握手中的性能热点
说了这么多单项数据,我们来张整体图。TLS 握手阶段,非对称运算占大头。以一次完整握手为例:
- ClientHello + ServerHello:纯文本,无加密开销
- 证书发送:签名验证消耗 CPU,RSA 4096 验证比 Ed25519 慢 3 倍
- 密钥交换:若用 RSA 做密钥传输,服务端需要解密,慢;若用 ECDHE,双方做点乘运算
- Finished 消息:对称加密 + 哈希,相比之下很轻
下面这张 SVG 图可以直观看到不同算法组合下的握手耗时对比(我基于实际压测数据画的):
从图上能清楚看到,RSA 4096 握手最重,Ed25519 + ECDHE 几乎是它十分之一的 CPU 开销。我在压测环境里重现过这个差距:同样的四核服务器,RSA 4096 只能承载 2000 次握手/秒,切到 Ed25519 后飙到 18000 次/秒。
4.5 选型建议:别纠结,看场景
说了这么多,我给几个简洁结论:
- 对称加密:服务端用 AES-128-GCM,移动端用 ChaCha20-Poly1305,别犹豫
- 非对称签名:能上 Ed25519 就上,不行就 ECDSA P-256,RSA 只留作向后兼容
- 非对称密钥交换:ECDHE 是标配,不要用 RSA 做密钥传输(慢且不安全)
- 哈希:SHA-256 够用,BLAKE2 性能更好但兼容性差,测试通过也能用
- 证书链:证书层级越深签名验证越多,尽量控制在三级以内
我曾经帮一个客户优化 TLS 性能,改动很简单:把 RSA 证书换成 Ed25519,同时打开 Session Resumption。握手延迟从 150ms 降到 20ms,CPU 占用砍掉 40%。我到现在还记得甲方工程师那表情,哈哈哈。
记住一条底线:性能对比不是跑分游戏,而是找到你业务场景下的平衡点。下一个章节我们再聊如何通过连接复用和缓存进一步削峰填谷。