ssh-keygen
在Unix / Linux系统上生成SSH身份验证密钥时,可以选择创建RSA或DSA密钥对(使用-t type
)。RSA和DSA密钥之间有什么区别? ?什么会导致某人选择另一个?
#1 楼
使用RSA。这就是妙语,现在有理由。如今,已知的最快的分解大整数的算法是“通用数域筛”,它也是解决有限域中以DSA指定的大质数p为模的离散对数问题的最快算法。如果将其视为相等,我们当然会倾向于速度更快的算法。但是同样,没有明确的赢家。您可以看一下本研究,或者,如果您的计算机上安装了OpenSSL,请运行
openssl speed
。您会看到,DSA在生成签名时执行得更快,但在验证相同密钥长度的签名时却要慢得多。一般来说,如果您要进行诸如带有签名的文件。签名生成一次(如果花费更长的时间就可以了),但是最终用户可能会更频繁地验证文档签名。两者都支持某种形式的加密方法,现成的RSA和DSA使用El Gamal。通常,DSA的解密速度更快,但加密速度较慢,而RSA则相反。再一次,您希望解密更快,因为一个加密的文档可能会被多次解密。但最后我保留了杀手级的论点:
man ssh-keygen
说,DSA密钥的长度必须恰好是1024位,才能与NIST的FIPS 186-2兼容。因此,尽管理论上可以使用更长的DSA密钥(FIPS 186-3也明确允许使用它们),但您仍被限制为1024位。而且,如果您考虑到此[文章],则对于RSA或DSA而言,我们不再具有1024位的安全性。评论
抱歉,您在几点上都错了。 DSA是在大小为p的有限域中定义的,其中p是大质数,而不是2的幂。关于离散对数,大小为2 ^ 1024的有限域比大小为p的有限域弱,其中p为特定算法(由Coppersmith设计)比Index Calculus更快。当前的FIPS 186是FIPS 186-3,它允许DSA密钥长于1024位(而ssh-keygen可以生成2048位DSA密钥)。对于SSH(客户端),没有加密问题,只有签名。
–托马斯·波宁(Thomas Pornin)
2011年7月9日在22:04
尽管FIPS-3允许更大的密钥长度,但是当前的ssh-keygen(Fedora 15)不允许-> ssh-keygen -t dsa -b 2048-> DSA密钥必须为1024位。尽管SSH仅涉及签名,但我认为指出差异仍然有意义。您对在Zp上定义DSA是正确的,我将对此进行更改。感谢您的发言!
–浮雕
2011年7月9日在22:38
@Thomas,它叫做openssl gendsa。 (密钥格式相同。)
–user1686
2011年10月10日,下午5:52
解密不太正确时,DSA速度更快:DSA只能签名/验证,没有内置加密功能。
–PaŭloEbermann
2011年11月6日在21:43
缺少解释为什么1024位不足的文章的链接。您能提供我感兴趣的原因吗?
– Edub Kendo
14年1月14日在18:23
#2 楼
现在的问题是一个更大的问题: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恰好被使用了两次,流量的观察者可以找出您的私钥。 (来源:有关DSA和ECDSA的维基百科,也是这个)。
最重要的是:
不要使用DSA或ECDSA。
Ed25519在数学上可能是最强大的(也是最快的),但尚未得到广泛的支持。另外,默认情况下,它比其他密钥类型具有更强的私钥加密(密码保护)。
如果您不能使用Ed25519,RSA是最好的选择。
评论
Ed25519不使用随机数k(而是从私钥和消息派生的),因此您只需要PRNG即可生成密钥,而无需签名。使用DSA和ECDSA时,许多实现都会失败,因为PRNG不好,但是有很多方法可以实现它,从而使PRNG幸免于难,例如使用Pornin的确定性变体。
– CodesInChaos
2014年2月7日在10:29
最近离散对数的进展是小的特征场。没有明显的方法可以通过主要特征字段或RSA将其转移到DSA。素数字段上的RSA和DSA可能彼此更接近安全性,即素数字段上的DSA接近小特征字段上的DSA。保理或DL的进步可能会发生,但是它们需要远远超出最新的发展,因此,在这些方面放弃DSA和/或RSA毫无必要。很有可能有人打破了ECC。
– CodesInChaos
2014年2月7日在10:33
是的,听到有人说“放弃DSA”让我感到困扰。我不是数学家,也不是大多数使用公钥密码学的用户,但是我只会放弃真正威胁迫在眉睫的东西,除非经过广泛的现场测试,否则肯定不会采用相对较新的东西并被证明是安全的。我们怎么知道这个用户不是NSA在说NSA可以更轻松地破坏DSA和ECDSA,因此我们切换到可以破坏的算法。哦,那些讨厌的情报机构,他们会让您大吃一惊!
–达斯塔
15年5月17日在2:46
使用Ed25519或具有4096位密钥的RSA。另请参阅流通良好的安全安全Shell编写。
–亚当·卡兹(Adam Katz)
2015年12月6日23:06
@bitsum RNG问题是真实的并且“迫在眉睫”。 OpenSSH只能生成1024位DSA密钥,该密钥太弱了。尽管它可以使用OpenSSL生成的2048位和3072位密钥,但这很麻烦。另外,从OpenSSH 7.0开始,默认情况下禁用DSA。另请参阅我的堆栈溢出答案。要尝试和真实吗?使用4096位RSA。
–亚当·卡兹(Adam Katz)
16 Jan 9'在3:23
#3 楼
在SSH的客户端上,在RSA和DSA之间进行选择并不重要,因为对于相同的密钥大小(使用2048位,您会很高兴),两者都提供了相似的安全性。SSH协议的版本1仅支持RSA密钥。当定义版本2时,RSA仍获得了专利,因此添加了对DSA的支持,因此可以进行开源的免专利实施。 RSA专利已在10年前到期,因此现在就不用担心。
从理论上讲,在某些非常特殊的情况下,一个或另一个的性能可能会出现问题:如果服务器是一个非常小型计算机(例如,i486),它将更喜欢具有RSA密钥的客户端,因为验证RSA签名比验证DSA签名在计算上更便宜。相反,DSA签名较短(通常为64个字节,而不是256个字节),因此,如果带宽很短,则最好使用DSA。无论如何,您将很难检测到这些影响,更不用说发现它们的重要性了。
在服务器上,首选DSA密钥,因为密钥交换将使用临时Diffie-Hellman密钥,这为“完美的前向保密性”开辟了道路(即,如果一个坏人窃取了服务器私钥,他仍然无法解密他本来会记录的过去的连接)。
评论
您能否详细说明在服务器端使用RSA密钥的风险?
– jrdioko
2011年7月10日,1:15
@jrdioko:连接时,使用诸如RSA(加密)或Diffie-Hellman之类的密钥交换机制来建立会话密钥。服务器上使用了相应的私钥。如果该密钥是瞬态的(即时生成,仅保留在RAM中,使用后丢弃),则可以防止随后的窃取。当服务器密钥(存储在文件中的永久密钥)仅用于签名(例如DSA密钥)时,则可以确保密钥交换密钥是临时的(然后由服务器对公钥进行签名),并且那很好。
–托马斯·波宁(Thomas Pornin)
2011年7月10日在17:46
也不能将DHE与RSA签名一起使用吗?
–PaŭloEbermann
2011年11月6日在21:45
@Paŭlo:实际上,对于SSHv2,即使使用RSA密钥,也始终使用DHE。使用DSA密钥只是确保获得PFS的简便方法,因为否则无法使用它。
–托马斯·波宁(Thomas Pornin)
11年7月7日在19:51
OpenSSH将SSH版本1和2 RSA密钥存储在不同的文件中,默认情况下甚至不再启用1。至少在OpenSSH中,很难意外地使用版本1。
–马特·诺德霍夫(Matt Nordhoff)
2014年2月9日在21:10
#4 楼
与DSA和ECDSA相比,RSA的另一个重要优点是您不需要安全的随机数生成器来创建签名。要生成签名,(EC)DSA需要一个必须是随机的,秘密的/不可预测的,并且永远不能再次使用。如果违反了其中一个属性,则可以从一个或两个签名中简单地恢复私钥。 Android的SecureRandom实现中的一个错误),并且很难完全防止。从理论上讲,有一种方法可以使(EC)DSA签名依赖于消息和私钥,这可以避免在RNG损坏的情况下完全失败,但是直到此为止集成到您的SSH客户端中(目前尚无OpenSSL发行版本(包括补丁)),我肯定会使用RSA密钥。
评论
您所谈到的优势-我们现在都知道RSA随机数生成器不是那么随机。我不知道这有多重要,但是无论如何...
– SPRBRN
2014年4月6日在20:28
@rxt是一个切线问题,它是公司RSA出售的特定产品中的默认RNG,与原始RSA公钥加密协议无关。
– michel-slm
2014年4月17日下午6:01
#5 楼
作为OpenSSH用户,我不太了解加密技术,我会坚持一个简单的事实:http://www.openssh.com/legacy.html中,它指出SHA1现在默认为禁用,因为它被认为是弱项:OpenSSH 7.0和更高版本同样禁用ssh-dss(DSA)公钥算法。它也很弱,我们建议不要使用它。
评论
Tom Leek在“为什么OpenSSH不推荐使用DSA密钥”中解释道:简而言之,这是他们自己的编码实践以及无法与当前标准保持一致的结果。
–安东·萨姆索诺夫(Anton Samsonov)
16-10-23在11:05
在2017年3月阅读此内容可为此评论提供新的思路。 SHA1已被破坏,因此OpenSSH明智地决定弃用SHA1。因此,我认为我会相信他们赞成弃用DSA。
–达比苏
17年2月28日在20:16
#6 楼
数学可能无关紧要。此线程似乎已下雪。这是路透社于2013年12月20日发表的文章:(路透社)-作为嵌入加密软件的运动的关键部分,
它可以破解进入广泛使用的计算机路透社获悉,美国国家安全局与美国国家安全局(RSA)达成了价值1000万美元的秘密合同。RSA是计算机安全行业中最具影响力的公司之一。
/>前NSA承包商Edward Snowden泄露的文件显示,
NSA创造并颁布了一个错误的公式来生成随机数,从而在加密产品“纽约”中创建“后门”。
《泰晤士报》 9月报道。路透社随后报道说,RSA通过将其滚动到名为Bsafe的软件工具中而成为该公式的最重要分发者,该工具用于增强个人计算机和许多其他产品的安全性。 />到目前为止,尚未公开的是RSA通过一笔交易获得了1000万美元
,根据两项协议,RSA将BSA软件中NSA公式设置为首选的或默认的数字生成方法。熟悉合同的消息来源
。证券备案显示,尽管这笔钱看似微不足道,但它却占RSA相关部门在过去一年中获得的收入的三分之一以上。
在本“科学星期五”播客中,艾拉询问马特·格林,马丁·海尔曼(公钥密码术的发明者)和菲尔·齐默曼(PGP的创建者),他们认为国家安全局已经破解了:
(大约17:26)
伊拉克:我们知道国家安全局已闯入了哪些事情?
马特:所以我们听到了我们可能会相信真实的事物的数量。 …随机数生成器…我们知道
NSA通过NIST…很可能在某些领域放了门
可以使它们完全破坏这些系统的标准算法中的一个。
Ira:您是说NSA创造了这些后门? 。因此NIST与NSA合作---法律要求它们。我们以为国家安全局(NSA)通过为美国人开发更多
安全标准来帮助NIST。我们现在怀疑---并且有充分的证据相信---情况恰恰相反。 NIST被用来提出NSA可能打破的标准。
考虑到这些最近的启示,算法的强度似乎基本无关。 RSA似乎是被NSA收购的私有公司,而DSA是由NIST自己创建的,据这些专家称,这在很大程度上是NSA加密研究的前沿。如果您使用的是几乎任何现代计算机都随附的随机数生成器,那么这真的没有关系,OpenSSH和其他计算机都可以使用这种随机数生成器。就我而言,我将相同的密钥重用于许多东西,因此不太希望DSA具有更快的生成速度。此外,也许RSA实际上是NIST和NSA的独立实体,但我们知道DSA是由NIST创建的。这是一个很大的机会。可以看出,除非有人对您提出了一些要求,但仍然相信更大的钥匙可以保护您,这确实无关紧要。整个过程在很大程度上只是一个试图闯入的人的烦恼。
评论
很公平。我添加了相关的引号并抄录了一些音频。感谢您的提醒。
– robmuh
2014年2月9日在19:42
您确定是1024位密钥吗?
– redreinard
2014年9月5日20:31在
您的答案并不完全一致。您混淆了有关RSA公司开发的RNG似乎已被篡改的事实,以及有关称为RSA(由上述公司的创始人开发)的公/私钥算法的事实。除非拥有巨型优化集群或量子计算机,否则无法轻易破解RSA算法(具有足够大的密钥)。至于DSA,它可能是由NIST发布的(我没有检查过),但NIST的发布也受到其他独立密码学家的审查。例如,他们警告过NIST批准的可疑RNG。
–惠更斯
2015年3月13日14:52
RSA Inc.的BSAFE产品使用Dual EC DRBG作为默认随机数生成器(甚至不是唯一提供的随机数生成器)这一事实与RSA算法的安全性或任何非加密软件的安全性无关不是为使用BSAFE而建立的。如果要提出阴谋论,至少要弄清事实。有足够的责任可以归咎于国家安全局(以及世界各地许多其他情报机构),并且有充分的理由归咎于RSA的默认违约行为,而无需提出毫无根据的主张。
–用户
16/09/24在20:17
#7 楼
RSA和DSA是两种完全不同的算法。 RSA密钥最多可以增加4096位,其中DSA必须恰好是1024位(尽管OpenSSL允许更多)。根据Bruce Schneier的说法,“具有相同长度密钥的DSA和RSA破解难度几乎相同”。评论
FIPS 186-2将模数限制为512到1024位。但是,2009年发布的修订版FIPS 186-3将模数限制为1024、2048或3072位。
– CodesInChaos
2015年9月5日19:19
#8 楼
ECDSA的问题不是很多后门。 Bernstein / Lange特别提到曲线加密分析不会攻击特定曲线,而是攻击曲线的类别(请参见幻灯片6)。ECDSA的问题在于NIST曲线难以正确实现(即恒定时间)并通过所有正确的验证)与Curve25519进行比较。 OpenSSL具有固定时间的P256实现,因此在这方面OpenSSH是安全的。
如果您仍然担心NIST曲线,则OpenSSH最近添加了对Ed25519方案的支持
评论
@Bhanu来自OpenSSH 6.3p1的ssh-keygen的默认值为2048位。阅读下面的答案,您还将发现2048位就足够了。确实,我不明白为什么建议是“选择最快的钥匙”。我认为有人会选择最慢的密钥,这将花费最长的时间来破解。鉴于身份验证实际上只执行一次,并且可以等待身份验证完成功能所需的“实时”时间。
之所以拥有DSA,是因为RSA以前曾经拥有专利。因此,DSA是在开源工具中实现的。现在,RSA的所有专利都已过期。因此,与DSA相比,使用DSA没有实际优势。工具保留了向后兼容性的支持,并且没有理由删除,因为它也是良好的加密方法之一