SSH 密码基准测试:为您的网络选择最快的加密算法
安全外壳(SSH)是全球无数系统安全远程访问和数据传输的支柱。虽然其主要功能是安全,但底层加密算法(即密码算法)会显著影响性能,尤其是在大批量数据传输期间。选择正确的密码算法可以决定是实现闪电般的快速传输,还是遭遇令人沮丧的性能瓶颈。
本文深入探讨了现代 SSH 加密的世界,比较了如 AES-GCM 和 ChaCha20-Poly1305 等流行密码算法的性能特征。我们将探讨影响密码算法速度的因素,提供在您的特定环境中对性能进行基准测试的实用方法,并指导您为网络的独特需求选择最佳加密方案,在吞吐量和强大的安全性之间取得平衡。
理解 SSH 密码算法及其作用
SSH 密码算法是用于加密和解密 SSH 客户端和服务器之间交换数据的算法。它的主要目标是确保通信的机密性、完整性和真实性。当您发起 SSH 连接时,客户端和服务器会协商它们都支持的一组算法(密码算法、MAC、密钥交换方法),最终就最强大和最首选的选项达成一致。这个协商过程对于建立安全通道至关重要。
不同的密码算法采用不同的数学运算,导致计算需求各异。一些算法针对硬件加速进行了优化,利用专用的 CPU 指令,而另一些算法则设计用于在更广泛的处理器上以软件形式高效运行。因此,密码算法的选择直接影响 CPU 利用率和由此产生的数据传输速度。
性能关键的现代 SSH 密码算法
在现代 SSH 环境中,有两种经过身份验证的加密算法家族因其出色的安全性和性能平衡而脱颖而出:AES-GCM 和 ChaCha20-Poly1305。两者都提供带附加数据的认证加密 (AEAD),这意味着它们在一个单一的步骤中同时加密数据并提供完整性检查,这比旧的“先加密后 MAC”的方法更高效、更安全。
AES-GCM(高级加密标准 - 伽罗瓦/计数器模式)
AES-GCM 是一种非常流行且被广泛采用的分组密码,以伽罗瓦/计数器模式运行。它提供强大的安全性,并且在具有硬件支持的系统上尤其快速。大多数现代 CPU(英特尔、AMD,以及越来越多的 ARM 处理器)都包含专用的指令集(如 x86/x64 架构上的 AES-NI),这些指令集极大地加速了 AES 操作,使 AES-GCM 极其高效。
- 优点:在硬件加速的 CPU 上具有出色的性能、强大的安全性、广泛支持。
- 缺点:在纯软件实现中(例如,在没有 AES-NI 的较旧或专用 CPU 上)可能会较慢。
ChaCha20-Poly1305
ChaCha20-Poly1305 是由 Daniel J. Bernstein 开发的一种流密码。它以其对软件友好的设计而闻名,即使在没有特定加密硬件加速的 CPU 上也能表现出色。这使其成为各种硬件(包括嵌入式系统、旧处理器或硬件加速不可持续或未针对其他算法优化的环境)的绝佳选择。
- 优点:出色的软件性能、强大的安全性、抵抗时序侧信道攻击的能力。
- 缺点:在现代桌面/服务器 CPU 上通常不如硬件加速的 AES-GCM 快速。
影响密码算法性能的因素
“最快”的密码算法并非一成不变;它取决于几个关键因素:
- CPU 架构和硬件加速:这是最重要的因素。如果您的 CPU 具有 AES-NI 或类似指令,AES-GCM 几乎肯定会胜过 ChaCha20-Poly1305。如果没有,ChaCha20-Poly1305 可能会占据优势。
- SSH 客户端和服务器实现:SSH 软件(例如 OpenSSH)及其使用的加密库(例如 OpenSSL)的效率会影响实际性能。新版本通常包含优化。
- 网络条件:虽然与密码算法速度没有直接关系,但网络延迟和可用带宽可能会掩盖或放大密码算法性能的感知差异。在非常慢的网络上,加密的 CPU 成本与网络限制相比可能微不足道。在非常快的网络上(例如 10 Gbps 或更高),由 CPU 限制的加密可能会成为瓶颈。
- 数据量和类型:使用不同数据大小(小文件与大文件)和类型(可压缩与不可压缩)进行基准测试,可能会揭示不同的性能特征。例如,非常小的传输可能主要受连接建立开销的影响,而不是密码算法的速度。
如何对 SSH 密码算法性能进行基准测试
基准测试涉及明确告知 SSH 使用特定的密码算法,然后测量传输已知数据量所需的时间。这可以实现直接比较。
1. 识别支持的密码算法
在开始之前,请检查您的 SSH 服务器支持哪些密码算法。您通常可以在服务器的 sshd_config 文件中找到此信息,或者通过使用 nmap --script ssh-auth-methods <IP> 运行 NMAP 扫描来查找。查看协商的密码算法的一种更简单的方法是使用详细的 SSH 输出:
ssh -vvv user@your_server
查找类似于 debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none 的行。
2. 使用 ssh -c 指定密码算法
ssh 客户端允许您使用 -c 标志指定所需的密码算法。您可以提供一个逗号分隔的列表,客户端将尝试使用列表中的第一个受支持的密码算法。
要测试的常见密码算法:
* [email protected]
* [email protected]
* [email protected]
3. 选择传输方法和数据源
为了进行一致的基准测试,您需要一种传输已知数据量的方法。
scp(安全复制):非常适合传输文件。使用一个大的、不可压缩的文件,以确保密码算法是瓶颈,而不是压缩或磁盘 I/O。sftp(SSH 文件传输协议):类似于scp,如果您更喜欢该协议,它会很有用。dd(数据复制器):可以生成一个数据流并通过 SSH 管道传输,适用于纯吞吐量测试,而无需客户端方面的文件系统开销。
实际基准测试步骤
假设您想测试从客户端到服务器的传输。您需要在客户端(或服务器)上准备一个足够大的测试文件(例如 1GB),以便进行有意义的测量,但又不能太大以至于测试时间过长。创建不可压缩测试文件的好方法是使用 /dev/urandom 或 /dev/zero。
在客户端(创建 1GB 虚拟文件):
pwd=$(pwd)
dd if=/dev/urandom of=$pwd/dummy_1GB.bin bs=1M count=1024 iflag=fullblock
使用 scp 进行基准测试:
-
测试 AES256-GCM:
bash echo "Testing AES256-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_gcm.bin -
测试 ChaCha20-Poly1305:
bash echo "Testing ChaCha20-Poly1305..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_chacha.bin -
测试 AES128-GCM(通常最快):
bash echo "Testing AES128-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_aes128_gcm.bin
使用 dd 和 pv 进行基准测试(用于实时吞吐量):
此方法通过 SSH 管道传输数据,可以显示实时速度,减少磁盘 I/O 作为瓶颈。pv (Pipe Viewer) 会提供进度和吞吐量信息。
安装 pv(如果尚未安装):
sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv # RHEL/CentOS
sudo brew install pv # macOS
-
使用
dd和pv测试 AES256-GCM:
bash echo "Testing AES256-GCM with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -c [email protected] user@your_server "cat > /dev/null" -
使用
dd和pv测试 ChaCha20-Poly1305:
bash echo "Testing ChaCha20-Poly1305 with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -c [email protected] user@your_server "cat > /dev/null"
提示:多次运行每个测试(例如 3-5 次)并取平均值,以消除网络波动或系统负载的影响。
结果解释和建议
运行基准测试后,比较 time 命令输出中的 real 时间或 pv 报告的平均吞吐量。您很可能会观察到明显的模式:
- 具有 AES-NI 的现代 CPU:您几乎肯定会发现
[email protected]和[email protected]提供了最高的吞吐量。由于加密轮次较少,AES-128 通常比 AES-256 稍快,但在硬件加速系统上这种差异可能可以忽略不计。 - 旧 CPU、ARM(没有特定加密扩展)或虚拟机:ChaCha20-Poly1305 的性能可能与 AES-GCM 相当,甚至可能超越 AES-GCM,因为其软件优化设计在这些场景中表现出色。
建议:
- 对于具有现代 Intel/AMD CPU(和 AES-NI)的高性能服务器:优先选择 AES-GCM(尤其是
[email protected])。它利用硬件加速来实现卓越的速度和安全性。 - 对于多样化的环境、旧硬件、基于 ARM 的系统或有利于软件性能的情况:ChaCha20-Poly1305 是一个绝佳的选择,它在各种架构中都能提供强大的安全性,并具有一致的高性能,而不依赖于特定硬件的功能。
- 安全第一:始终选择提供认证加密 (AEAD) 的密码算法。AES-GCM 和 ChaCha20-Poly1305 都是 AEAD 密码算法,被认为是强大的。如果可能,应避免使用旧的、非 AEAD 的密码算法,如
aes*-cbc。
其他 SSH 性能注意事项
虽然选择密码算法至关重要,但请记住,它是更广泛性能图景的一部分:
- 压缩:SSH 可以在加密前压缩数据(在
~/.ssh/config中使用-o Compression=yes或Compression yes)。对于在慢速链路上进行的高度可压缩数据,这可以显着提高感知速度,即使它会带来轻微的 CPU 开销。对于已经压缩的数据或非常快的链路,它可能会降低性能。 - 连接多路复用:OpenSSH 中的
ControlMaster等功能允许多个 SSH 会话重用单个底层 TCP 连接,从而减少后续连接的握手开销。 - MTU(最大传输单元):确保您的网络 MTU 得到优化,以防止碎片化,碎片化会降低性能。
- SSH 客户端/服务器版本:保持您的 SSH 客户端和服务器软件更新。新版本通常包含性能改进和对较新、更快速的密码算法的支持。
结论
优化 SSH 密码算法的选择是提高安全数据传输性能的有力方法,而无需牺牲安全性。通过了解 AES-GCM 和 ChaCha20-Poly1305 等现代密码算法的特性,并在您的特定网络环境中进行实用的基准测试,您可以做出明智的决策。
请记住,“最快”的密码算法是依赖于上下文的。进行一次快速的基准测试会议可以揭示哪种密码算法真正为您的基础设施提供了速度和安全的最佳平衡。定期审查您的 SSH 配置,并关注密码学性能的新发展,以维护高效和安全的网络。