id_rsa.pub和id_dsa.pub有什么区别?

108

哪一个更安全?

5个回答

72

id_rsa.pubid_dsa.pubid_rsaid_dsa的公钥。

如果您与SSH有关,那么id_rsaRSA密钥,并可与SSH协议1或2一起使用,而id_dsaDSA密钥,仅能与SSH协议2一起使用。 两者都非常安全,但DSA似乎是目前的标准(假设您的所有客户端/服务器都支持SSH 2)。

更新:自编写此文章以来,DSA已被证明不安全。有关更多信息,请参见Adam Katz的回答。


1
我必须不同意这个观点。今天(虽然在2010年发布时也是如此,但程度较小),1024位(DSA可用的最大密钥大小)被认为太弱了。因此,RSA是更好的选择。至于SSH v1:十年前我就认为它不安全了。 - Adam Katz
4
DSA 自 2009 年起就支持 2048 位和 3072 位密钥(参见 FIPS 186-3)。大多数 SSH 客户端/服务器都支持更大的 DSA 密钥,包括 OpenSSH 和 PuTTY。大多数密钥生成器也支持更大的 DSA 密钥,但是 OpenSSH 的 ssh-keygen 仍然不支持(尽管 ssh 和 sshd 都支持)。对于 Linux,您可以使用 OpenSSL 生成更大的 DSA 密钥,具体方法请参考此博客文章 - Mike Pelley
2
有趣!我之前不知道这个,这肯定有助于平衡两者之间的差距(尽管缺乏OpenSSH支持相当严重)。不过,我不会说DSA是标准(无论现在还是在2010年),而RSA绝对是标准的(我们正在转向椭圆曲线系统,如Ed25519)。 - Adam Katz

62

SSH 使用 公钥/私钥对,所以 id_rsa 是你的 RSA 私钥(基于质数),比你的 id_dsa DSA 私钥(基于指数)更安全。请保管好你的私钥,并广泛分享你的 id_rsa.pubid_dsa.pub 公钥。

DSA 是不安全的

DSA如果您的计算机的随机数生成器不够好,会有一个可猜测的参数,这将暴露您的秘密密钥。ECDSA(DSA的椭圆曲线升级)同样存在漏洞。即使有好的随机数,DSA也存在其他强度问题(这些问题也存在于Diffie-Hellman中)。
OpenSSH创建了不安全的1024位密钥(解决方法),现在默认禁用DSA。

推荐使用Ed25519

椭圆曲线密码学提供了更小的密钥大小和更高的复杂性。Ed25519(基于平面建模的椭圆曲线的复杂性)是首选的实现,因为它被认为没有被干扰(泄露的文件显示美国NSA削弱了加密标准)。
Ed25519在OpenSSH 6.5(2014-01-30)和GnuPG 2.1(2014-11-06)中被引入,并在OpenSSH 8.5(2021-03-03)中成为默认的("首选")算法。旧系统可能尚未支持Ed25519,但支持的实现列表一直在稳步增长。
当Ed25519不可用时,请使用4096位的RSA算法。
RSA密钥大小为4096位,使用rsa-sha2-512的签名变体(在OpenSSH 7.2中添加,2016-02-29,默认在OpenSSH 8.2中,2020-02-14)应具有与Ed25519相当的复杂性。
由于担心RSA可能存在与DSA相同的强度问题,Ed25519仍然优先于RSA,尽管预计将该漏洞应用于RSA会更加困难。

3
只有一个更正:DSA自2009年起支持2048位和3072位密钥(根据FIPS 186-3)。更多信息请参见我的上面的评论。 - Mike Pelley
3
Infosec SE对这个问题有一个很好的回答,深入探讨了这个问题。它引用了Black Hat 2013的一次演讲,该演讲表明即使在更大的密钥尺寸下,DSA也不再安全。 - Adam Katz
3
我已经更新了这个答案,更全面地介绍了DSA的问题。现在它比(同样有效的)Infosec SE答案更详细。当你将鼠标悬停在一些链接上时,甚至会有更多的细节。 - Adam Katz
2
这篇文章教会了我很多东西,需要更多的赞。 - lilHar

7

RSA被认为更安全。

然而(2020年5月,十年后),根据JulioOpenSSH 8.2报告,这种情况已经不再成立。

未来弃用通知

现在可以以不到5万美元的价格对SHA-1哈希算法执行选择前缀攻击。
因此,我们将在不久的将来发布中默认禁用依赖于SHA-1的“ssh-rsa”公钥签名算法。

(见Leurent,G和Peyrin,T(2020)“ SHA-1是一场灾难:对SHA-1的首个选择前缀碰撞及其在PGP信任网络中的应用”的 "链接")

This algorithm is unfortunately still used widely despite the existence of better alternatives, being the only remaining public key signature algorithm specified by the original SSH RFCs.

The better alternatives include:

  • The RFC8332 RSA SHA-2 signature algorithms rsa-sha2-256/512.
    These algorithms have the advantage of using the same key type as "ssh-rsa", but use the safe SHA-2 hash algorithms.
    These have been supported since OpenSSH 7.2 and are already used by default if the client and server support them.

  • The ssh-ed25519 signature algorithm.
    It has been supported in OpenSSH since release 6.5.

  • The RFC5656 ECDSA algorithms: ecdsa-sha2-nistp256/384/521.
    These have been supported by OpenSSH since release 5.7.

To check whether a server is using the weak ssh-rsa public key algorithm for host authentication, try to connect to it after removing the ssh-rsa algorithm from ssh(1)'s allowed list:

ssh -oHostKeyAlgorithms=-ssh-rsa user@host

If the host key verification fails and no other supported host key types are available, the server software on that host should be upgraded.

A future release of OpenSSH will enable UpdateHostKeys by default to allow the client to automatically migrate to better algorithms.
Users may consider enabling this option manually.


正如您所指出的,自OpenSSH 7.2(2016年)以来,默认的RSA签名变体一直是rsa-sha2-512。这解决了SHA-1的弱点,并提醒我们RSA本身仍被认为是安全的。自OpenSSH 8.2(2020年2月)以来,默认启用了UpdateHostKeys(请参考此链接)。无论哪种形式的RSA都比任何形式的DSA更安全,尽管如今您应该优先选择ed25519,详细解释请参考我的回答 - undefined
@AdamKatz 确实。有没有最近的进展促使你发表这样的评论? - undefined
只是我刚刚看到了你的回答,它可能被解读为DSA比RSA更安全,而且RSA不应该被使用。然而,这两个说法都是不正确的,尽管在2016年之前生成并部署在运行OpenSSH < 8.2的系统上的RSA密钥应该手动更新。 - undefined
@AdamKatz 好的,谢谢你的反馈。我已经将你的评论包含在答案中,以增加可见度。 - undefined

1

-10

一个使用DSA,另一个使用RSA


假设您只是使用默认名称(逻辑上看起来是这样),theatrus的想法非常正确。 - David Larrabee
你没有回答问题的实质部分:哪个更安全。因为这是最高票的答案,所以我要给你点个踩。但其实并不需要这样。 - akauppi

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