用于 SSH 身份验证密钥的 RSA 与 DSA

信息安全 加密 密码学 验证 密钥管理 SSH
2021-08-18 21:28:51

在 Unix/Linux 系统上使用 生成 SSH 身份验证密钥时ssh-keygen,您可以选择创建 RSA 或 DSA 密钥对(使用-t type)。

RSA 和 DSA 密钥有什么区别?什么会导致某人选择其中一个而不是另一个?

4个回答

使用 RSA。

DSA 的签名生成速度更快,但验证速度较慢,加密速度较慢,但​​解密速度较快,并且与相同密钥长度的 RSA 密钥相比,安全性可以被认为是等效的。这是妙语,现在是一些理由。

RSA 算法的安全性基于大整数的因式分解已知是“困难的”这一事实,而 DSA 安全性基于离散对数问题。今天,已知最快的大整数分解算法是通用数域筛法,它也是解决有限域中离散对数问题的最快算法,该算法对 DSA 指定的大素数 p 取模。

现在,如果可以认为安全性相同,我们当然会倾向于更快的算法。但同样,没有明确的赢家。

您可以查看这项研究,或者,如果您的机器上安装了 OpenSSL,请运行openssl speed. 您将看到 DSA 在生成签名时执行得更快,但在验证相同密钥长度的签名时要慢得多。如果您处理例如已签名的文件,则验证通常是您希望更快的。签名会生成一次——所以如果这需要更长的时间也没关系——但最终用户可能会更频繁地验证文档签名。

两者都支持某种形式的加密方法,即开箱即用的 RSA 和使用El Gamal的 DSA 。DSA 通常解密速度更快,但加密速度较慢,而 RSA 则相反。同样,您希望此处的解密速度更快,因为一个加密的文档可能会被多次解密。

在商业方面,RSA 显然是赢家,商业 RSA 证书比 DSA 证书部署得更广泛。

但我把杀手锏留到了最后:man ssh-keygen说 DSA 密钥的长度必须正好为 1024 位才能符合 NIST 的FIPS 186-2因此,尽管理论上更长的 DSA 密钥是可能的(FIPS 186-3 也明确允许它们),但您仍然被限制为 1024 位。如果您考虑到这篇 [article] 的考虑,我们将不再对 RSA 或 DSA 使用 1024 位安全。

所以今天,最好使用 RSA 2048 或 4096 位密钥。

现在的问题有点广泛:RSA vs. DSA vs. ECDSA vs. Ed25519所以:

在 BlackHat 2013 上的一次演讲表明,在解决DSA和其他一些算法的优势所在的复杂性问题方面已经取得了重大进展,因此它们可以很快在数学上被破解。此外,攻击也可能(但更难)扩展到 RSA。

该演示文稿建议改用椭圆曲线密码学。OpenSSH 支持的 ECC 算法是ECDSA,并且自 OpenSSH 6.5 起支持Ed25519。

OpenSSH 仅支持 ECDSA 的 NIST 曲线,根据这项研究,这些曲线看起来对NSA 后门非常可疑。如果 NSA 已经可以破解它,那么对于其他人来说破解它就不会像正确的曲线那样难。Ed25519 是同样的东西,但曲线更好,所以它是防止底层算法在数学上被破坏的最安全的赌注。

此外,DSA 和 ECDSA 有一个讨厌的特性:它们需要一个通常称为k的参数是完全随机的、秘密的和唯一的。在实践中,这意味着如果你从一台随机数生成器很差的机器连接到你的服务器,例如,相同的k恰好被使用了两次,流量的观察者可以找出你的私钥。(来源:关于DSAECDSA的维基百科,也是这个)。

底线是:

  • 切勿使用 DSA 或 ECDSA。
  • Ed25519可能是数学上最强的(也是最快的),但尚未得到广泛支持。作为奖励,默认情况下,它比其他密钥类型具有更强的私钥加密(密码保护)。
  • 如果您不能使用 Ed25519,RSA是最好的选择。

在 SSH 中,在客户端,RSA 和 DSA 之间的选择并不重要,因为两者都为相同的密钥大小提供了相似的安全性(使用 2048 位,你会很高兴)。

从历史上看,SSH 协议的版本 1 仅支持 RSA 密钥。在定义第 2 版时,RSA 仍然是专利,因此添加了对 DSA 的支持,这样就可以进行开源的无专利实施。RSA专利10多年前就过期了,现在不用担心了。

从理论上讲,在某些非常特殊的情况下,您可能会遇到其中一个或另一个的性能问题:如果服务器是一台非常小的机器(例如 i486),它会更喜欢使用 RSA 密钥的客户端,因为验证 RSA 签名的工作更少在计算上比验证 DSA 签名更昂贵。相反,DSA 签名更短(通常 64 字节与 256 字节),因此如果您的带宽非常短,您更喜欢 DSA。无论如何,您将很难检测到这些影响,更不用说发现它们很重要了。

服务器上,首选 DSA 密钥,因为这样密钥交换将使用临时 Diffie-Hellman 密钥,这为“完美前向保密”开辟了道路(即,如果坏人窃取了服务器私钥,他仍然无法解密他会记录过去的联系)。

RSA 相对于 DSA 和 ECDSA 的另一个重要优势是您不需要安全的随机数生成器来创建签名。

为了生成签名,(EC)DSA 需要一个必须是随机的、秘密的/不可预测的并且永远不能再次使用的值。如果违反了这些属性之一,则可以从一两个签名中轻松恢复私钥

这曾经发生过(一次是 Debian 中的 OpenSSL PRNG 补丁损坏,一次是 Android 的 SecureRandom 实现中的错误),并且很难完全防止。

使用 RSA,在这些情况下,如果之前使用正确播种的 PRNG 创建了实际的身份验证密钥对,那么只有您的临时会话密钥会受到损害。

从理论上讲,有一种方法可以使(EC)DSA 签名依赖于消息和私钥,这可以避免在 RNG 损坏的情况下完全失败,但直到它集成到您​​的 SSH 客户端(没有 OpenSSL 发布版本包括现在的补丁),我肯定会使用 RSA 密钥。