SSH2会话中最耗费计算资源的步骤是什么?

4
我正在尝试弄清楚在SSH2密钥交换/身份验证/会话初始化中使用最多CPU的是什么。我正在为嵌入式CPU进行优化,目前会话初始化似乎是最大的瓶颈。具体来说,我正在使用带有RSA密钥对的dropbear服务器。RSA或其部分是否需要大量CPU计算能力?
谢谢!

1
你能对代码进行性能分析吗?另外,接受更多的答案来回答你的问题。否则,很多人会选择不帮助你。 - Null Set
1
直觉告诉我们,最耗费时间的步骤是RSA身份验证和DH密钥交换。与后续的对称加密相比,这两个步骤都需要进行重量级计算。在优化时一定要非常谨慎,特别是如果时间等侧信道可能成为问题时更应该如此。 - Gilles 'SO- stop being evil'
1个回答

7

SSH2密钥交换中三个最昂贵的操作是(在服务器上):

  • Diffie-Hellman密钥交换。
  • 由服务器动态计算的RSA签名。
  • 对由客户端动态计算的签名进行验证(如果客户端使用非对称密钥对进行身份验证)。

如果客户端使用RSA密钥对,则第三个操作会更快:RSA签名验证非常快,而DSA签名验证很昂贵(实际上比DSA签名生成还要昂贵)。

Diffie-Hellman密钥交换是在SSH规范(第8节)中的两个组之一进行的,分别称为diffie-hellman-group1-sha1diffie-hellman-group14-sha1。后者使用2048位模数,而前者则使用1024位模数。预计较大的模数意味着DH成本比较小的模数高4到8倍。然而,1024位DH被认为与1024位RSA一样安全,因此不建议用于长期安全(在SSH中,DH用于获取实际加密密钥;因此,您希望DH能够保持与通过SSH连接交换的数据机密性相同的时间)。

类似地,RSA签名生成成本在很大程度上取决于密钥大小:2048位RSA签名生成需要的CPU时间约为1024位RSA签名生成所需时间的8倍。DSA签名生成可能比RSA签名生成稍快一些(最多可能快两倍)。

因此,更快的标准SSH2服务器操作建议如下:

  • 使用 diffie-hellman-group1-sha1 进行密钥交换(如果您可以容忍不太理想的安全性);
  • 服务器使用 DSA 密钥;
  • 客户端使用 RSA 密钥。

一些 SSH 实现(特别是较新版本的 OpenSSH)支持 ECDSA 签名,并且可能使用 ECDH(椭圆曲线上的 Diffie-Hellman)而不是普通 DH。ECDSA 和 ECDH 应该比 DSA 和 DH 更快。此外,基于 256 位椭圆曲线的 ECDSA 和 ECDH 应该实现适当的长期安全性。在 OpenSSH 中,您可以通过将 KexAlgorithms 服务器选项设置为 ecdh-sha2-nistp256 来选择这样的曲线进行 ECDH; 而 ssh-keygen -t ecdsa -b 256 将产生与相同曲线上的 ECDSA 密钥对。

因此,更快速的 OpenSSH 服务器操作建议如下:

  • 使用 ecdh-sha2-nistp256 进行密钥交换;
  • 服务器使用 256 位 ECDSA 密钥对;
  • 客户端使用 RSA 密钥。

为了更快的客户端操作,反转客户端和服务器密钥对的条件。


哇!这正是我正在寻找的,而且更多!非常感谢。 - lxe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接