openssl speed 是 OpenSSL 官方提供的加密算法性能基准测试工具。通过它可以了解不同加密算法在当前硬件上的处理速度,从而为生产环境选择合适的加密算法提供数据支撑。

基本用法

1
openssl speed [options] [algorithm...]

常用选项:

  • -seconds N — 测试持续时间(默认 10 秒)
  • -bytes N — 测试缓冲区大小(默认 16KB)
  • -evp name — 使用 EVP 接口测试指定算法
  • -elapsed — 使用 wall-clock 时间而非 CPU 时间
  • -mr — 产生机器可读的输出

对称加密算法性能测试

测试 AES-256-GCM

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ openssl speed -seconds 1 -evp aes-256-gcm
Doing AES-256-GCM for 1s on 16 size blocks: 1502986 AES-256-GCM's in 1.00s
Doing AES-256-GCM for 1s on 64 size blocks: 1375746 AES-256-GCM's in 1.00s
Doing AES-256-GCM for 1s on 256 size blocks: 1306923 AES-256-GCM's in 1.00s
Doing AES-256-GCM for 1s on 1024 size blocks: 907925 AES-256-GCM's in 1.00s
Doing AES-256-GCM for 1s on 8192 size blocks: 255844 AES-256-GCM's in 1.00s
Doing AES-256-GCM for 1s on 16384 size blocks: 140289 AES-256-GCM's in 1.00s
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
AES-256-GCM      24047.78k    88047.74k   334572.29k   929715.20k  2095874.05k  2298494.98k

测试 ChaCha20-Poly1305

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ openssl speed -seconds 1 -evp chacha20-poly1305
Doing ChaCha20-Poly1305 for 1s on 16 size blocks: 11439657 ChaCha20-Poly1305's in 1.00s
Doing ChaCha20-Poly1305 for 1s on 64 size blocks: 5488525 ChaCha20-Poly1305's in 1.00s
Doing ChaCha20-Poly1305 for 1s on 256 size blocks: 2844621 ChaCha20-Poly1305's in 1.00s
Doing ChaCha20-Poly1305 for 1s on 1024 size blocks: 1225154 ChaCha20-Poly1305's in 1.00s
Doing ChaCha20-Poly1305 for 1s on 8192 size blocks: 167295 ChaCha20-Poly1305's in 1.00s
Doing ChaCha20-Poly1305 for 1s on 16384 size blocks: 84364 ChaCha20-Poly1305's in 1.00s
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
ChaCha20-Poly1305   183034.51k   351265.60k   728222.98k  1254557.70k  1370480.64k  1382219.78k

性能对比分析

在大数据块(8192 字节)场景下:

  • ChaCha20-Poly1305: 1370 MB/s
  • AES-256-GCM: 2095 MB/s

在小数据块(64 字节)场景下:

  • ChaCha20-Poly1305: 351 MB/s
  • AES-256-GCM: 88 MB/s

结论

  • AES-256-GCM 在大块数据加密时性能更优
  • ChaCha20-Poly1305 在小块数据场景下性能更稳定,适合移动设备

哈希算法性能测试

测试 SHA-256

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ openssl speed -seconds 1 -evp sha256
Doing sha256 for 1s on 16 size blocks: 2441039 sha256's in 1.00s
Doing sha256 for 1s on 64 size blocks: 1508808 sha256's in 1.00s
Doing sha256 for 1s on 256 size blocks: 882935 sha256's in 1.00s
Doing sha256 for 1s on 1024 size blocks: 293558 sha256's in 1.00s
Doing sha256 for 1s on 8192 size blocks: 41751 sha256's in 1.00s
Doing sha256 for 1s on 16384 size blocks: 21220 sha256's in 1.00s
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes  16384 bytes
sha256           39056.62k    96563.71k   226031.36k   300603.39k   342024.19k   347668.48k

在大数据块场景下,SHA-256 可以达到约 347 MB/s。

常用算法快速测试

一键测试多个算法

1
2
3
4
5
# 测试多个对称加密算法
openssl speed -seconds 1 -evp aes-128-cbc aes-256-cbc aes-128-gcm aes-256-gcm chacha20-poly1305

# 测试多个哈希算法
openssl speed -seconds 1 -evp sha256 sha384 sha512 shake128 shake256

机器可读输出

1
openssl speed -seconds 1 -mr -evp aes-256-gcm

机器可读格式便于编写脚本自动分析结果。

性能优化建议

1. 选择合适的对称加密算法

场景 推荐算法 原因
高性能服务器 AES-256-GCM 大块数据加密性能最优
移动设备/低功耗 ChaCha20-Poly1305 小块数据性能稳定,无需硬件支持
通用场景 AES-128-GCM 平衡安全性和性能

2. 启用硬件加速

现代 CPU 通常支持 AES-NI 指令集,可以大幅提升 AES 性能。检查是否启用:

1
2
3
4
5
# 检查 CPU 支持
grep -o aes /proc/cpuinfo

# 或者通过 OpenSSL 查看
openssl engine -t -c

3. 考虑算法组合

在 TLS 配置中,可以根据客户端类型选择不同算法:

1
2
3
# Nginx 配置示例
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-CHACHA20-POLY1305';

这样支持 AES-NI 的客户端会使用 AES,其他客户端会回退到 ChaCha20。

注意事项

  1. 测试环境与生产环境差异:基准测试结果受 CPU 型号、负载、内存等因素影响,建议在目标硬件上进行测试。

  2. OpenSSL 版本影响:不同版本的 OpenSSL 性能可能有差异,建议使用生产环境的相同版本测试。

  3. 测试时间选择:建议在系统负载较低时进行测试,以获得更准确的结果。

  4. 多核并行测试:可以使用 -multi 选项进行多核并行测试,更全面地评估性能。

1
2
# 使用 4 个并行任务测试
openssl speed -seconds 1 -multi 4 -evp aes-256-gcm

总结

openssl speed 是评估加密算法性能的实用工具。通过实际测试可以发现:

  • 在支持 AES-NI 的硬件上,AES-256-GCM 是大块数据加密的首选
  • 在不支持硬件加速的场景下,ChaCha20-Poly1305 提供了更好的性能
  • 选择加密算法时,需要综合考虑安全性、性能和兼容性

建议在部署前使用 openssl speed 在目标硬件上进行实际测试,以获得最准确的性能数据。


参考来源