基准测试SSH加密算法:为您的网络选择最快的加密方式
使用scp、ssh、dd和pv安全地基准测试SSH加密算法,然后根据您的实际硬件选择AES-GCM或ChaCha20。
基准测试SSH加密算法:为您的网络选择最快的加密方式
当加密传输速度低于网络允许的速度时,对SSH加密算法进行基准测试非常有用。加密算法并不总是瓶颈,但在快速链路或小型CPU上,它可能决定scp、sftp或rsync -e ssh是否能充分利用连接带宽。
正确的答案取决于您的客户端、服务器、CPU特性、OpenSSH构建以及网络路径。在全面更改默认设置之前,请在自己的环境中进行测试。
理解SSH加密算法及其作用
SSH加密算法是一种用于加密和解密SSH客户端与服务器之间交换数据的算法。其主要目标是确保通信的机密性、完整性和真实性。当您发起SSH连接时,客户端和服务器会协商一组双方都支持的算法(加密算法、MAC、密钥交换方法),最终达成最强且最优先的选项。这个协商过程对于建立安全通道至关重要。
不同的加密算法采用不同的数学运算,导致计算需求各异。一些算法针对硬件加速进行了优化,利用专门的CPU指令,而另一些则设计为在更广泛的处理器上高效运行于软件中。因此,加密算法的选择直接影响CPU利用率和数据传输速度。
现代SSH加密算法的性能关键
在现代SSH环境中,两类认证加密算法因其出色的安全性和性能平衡而脱颖而出:AES-GCM和ChaCha20-Poly1305。两者都提供带关联数据的认证加密(AEAD),意味着它们在一次操作中同时加密数据并提供完整性检查,比旧的先加密后MAC方法更高效、更安全。
AES-GCM(高级加密标准 - 伽罗瓦/计数器模式)
AES-GCM是一种非常流行且广泛采用的块密码,运行在伽罗瓦/计数器模式下。它提供强大的安全性,并且在具有AES硬件支持的系统上特别快。大多数现代CPU(Intel、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客户端支持哪些加密算法:
ssh -Q cipher
然后使用详细的SSH输出来查看实际连接协商了什么:
ssh -vvv user@your_server
查找类似debug1: kex: server->client cipher: [email protected] MAC: <implicit> compression: none的行。服务器策略由sshd_config中的Ciphers控制,但有效支持取决于客户端和服务器。
2. 使用ssh -c指定加密算法
ssh客户端允许您使用-c标志指定所需的加密算法。您可以提供一个逗号分隔的列表,客户端将尝试使用列表中第一个支持的加密算法。
要测试的常见加密算法:
3. 选择传输方法和数据源
为了进行一致的基准测试,您需要一种传输已知数据量的方法。
scp(安全复制):适合传输文件。使用一个大的、不可压缩的文件,以确保加密算法是瓶颈,而不是压缩或磁盘I/O。sftp(SSH文件传输协议):类似于scp,如果您更喜欢该协议则很有用。dd(数据复制器):可以生成数据流并通过SSH管道传输,适用于纯吞吐量测试,无需客户端文件系统开销。
实际基准测试步骤
假设您想从客户端到服务器进行基准测试。您需要在客户端(或服务器)上有一个足够大(例如1GB)的测试文件,以便进行有意义的测量,但不要太大以至于测试耗时过长。创建不可压缩测试文件的好方法是使用/dev/urandom。仅在禁用SSH压缩时使用/dev/zero,因为全零数据高度可压缩。
在客户端(创建1GB虚拟文件):
pwd=$(pwd)
dd if=/dev/urandom of=$pwd/dummy_1GB.bin bs=1M count=1024 iflag=fullblock
使用scp进行基准测试:
测试AES256-GCM:
echo "Testing AES256-GCM..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_gcm.bin测试ChaCha20-Poly1305:
echo "Testing ChaCha20-Poly1305..." time scp -c [email protected] dummy_1GB.bin user@your_server:/tmp/test_chacha.bin测试AES128-GCM(通常最快):
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(管道查看器)提供进度和吞吐量信息。
安装pv(如果尚未安装):
sudo apt-get install pv # Debian/Ubuntu
sudo yum install pv # RHEL/CentOS
sudo brew install pv # macOS
使用
dd和pv测试AES256-GCM:echo "Testing AES256-GCM with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -c [email protected] user@your_server "cat > /dev/null"使用
dd和pv测试ChaCha20-Poly1305:echo "Testing ChaCha20-Poly1305 with dd..." dd if=/dev/zero bs=1M count=1024 | pv | ssh -o Compression=no -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相当甚至更优,因为其软件优化设计在这些场景中表现出色。
建议:
- 对于具有现代Intel/AMD CPU(和AES-NI)的高性能服务器:优先选择AES-GCM(尤其是
[email protected])。它利用硬件加速实现卓越的速度和安全性。 - 对于多样化环境、旧硬件、基于ARM的系统或偏好软件性能的情况:ChaCha20-Poly1305是一个优秀的选择,提供强大的安全性,并在各种架构上保持一致的高性能,而不依赖硬件特定功能。
- 安全第一:始终选择提供认证加密(AEAD)的加密算法。AES-GCM和ChaCha20-Poly1305都是AEAD加密算法,被认为是强大的。如果可能,避免使用旧的、非AEAD的加密算法,如
aes*-cbc。
其他SSH性能考虑
虽然加密算法选择至关重要,但请记住,它是更广泛性能图景的一部分:
- 压缩:SSH可以在加密前压缩数据(
-o Compression=yes或~/.ssh/config中的Compression yes)。对于高度可压缩的数据在慢速链路上,这可以显著提高感知速度,即使它增加了轻微的CPU开销。对于已压缩的数据或非常快的链路,它可能降低性能。 - 连接复用:OpenSSH中的
ControlMaster等功能允许多个SSH会话重用单个底层TCP连接,减少后续连接的开销。 - MTU(最大传输单元):确保您的网络MTU已优化,以防止碎片化,这可能会降低性能。
- SSH客户端/服务器版本:保持您的SSH客户端和服务器软件更新。较新版本通常包含性能改进和对更新、更快加密算法的支持。
根据您的测量结果选择
优化SSH加密算法选择可以提高安全传输性能,但仅在加密是限制因素时。运行多次测试,保持压缩和文件大小一致,并比较CPU使用率和传输时间。
对于许多现代服务器,由于硬件加速,AES-GCM表现良好。在旧系统、嵌入式硬件和一些虚拟化环境中,ChaCha20-Poly1305可能是更好的选择。除非您有可以隔离和记录的兼容性要求,否则请避免在正常使用中使用旧的CBC加密算法。