偶尔,在解释如何设置SSH的公钥认证系统时,有人问我RSA和DSA密钥哪个更好。在接下来的几段中,我将尝试回答这个问题。在讨论之前,我会先透露一下,虽然我在以太网局域网和TCP/IP网络方面有一定的专业知识,但我对密码学的理解充其量只是个外行。下面的讨论是基于互联网的研究,其中有些是矛盾的,就像所有互联网的东西一样,有些链接比其他链接更可靠。
首先,什么是RSA和DSA密钥?
DSA或数字签名算法,是美国国家安全局为数字签名设计的一个美国政府标准。它源于ElGamal签名算法。其安全性是基于解决某些类型的对数函数的难度。它只能用于数字签名。
RSA的名字来自于作者Ron Rivest、Adi Shamir和Leonard Adleman的首字母,他们是第一次发表该算法的人。它是基于对大数进行分解的困难。与DSA不同,RSA可以用来加密整个信息。
我的理解是解决对数问题和因数问题同样难,但我找到一些参考资料,说对数问题更难(我也找到一些参考资料,说它们同样难)。
我认为不重要的事情,但你可能已经听到或将来可能听到。
- DSA的签名速度比RSA快,但RSA在验证阶段的速度更快,因为验证需要这两个阶段,所以差别并不重要。
- 正如我上面所说的,DSA只能用于认证,而RSA既可以用于认证,也可以用于加密消息。然而,SSH只使用密钥进行身份验证,所以同样,两者的区别并不重要。
- 对于同样的密钥长度,DSA会生成一个较小的签名文件。不过,由于每个密钥都要占用一个磁盘块,这也就无所谓了。
- DSA密钥最初被限制在1024位,但现在已经不是这样了。
- 我在"国家漏洞数据库"中搜索了"密钥和DSA"以及"密钥和RSA",发现有2个涉及DSA密钥的漏洞和5个涉及RSA密钥的漏洞。据我所知,所有这些漏洞都已在OpenSSL/OpenSSH的最新版本中得到解决,现在是OpenVOS互联网安全包的一部分。
有利于DSA的事情。
- DSA只能与SSH协议2一起使用,而RSA可以与协议1和2一起使用(参见"SSH 2″与"OpenSSL和OpenSSH第2版")。协议1有一些重大的设计缺陷,已经被协议2版本所取代。我认为这是一个稍稍偏向于使用DSA密钥的理由,这是一种内置的保护,避免使用旧的过时协议。
有利于RSA的事情。
- 一个不好的随机数发生器会泄露DSA密钥位(不要问我怎么泄露)。
- openssh.org网站似乎对哪个更好的问题不置可否,但新版本的ssh-keygen会在你不指定类型的情况下创建一个RSA密钥。
- 引用RSA密钥的RFCs似乎比DSA密钥更多(也更新)。
一些比较(文件大小包括不属于密钥的文本)。
DSA创建时间 | RSA创建时间 | DSA字节 | RSA字节 | DSA.pub字节 | RSA.pub字节 | |
1024位 | 1秒 | 1秒 | 736 | 951 | 610 | 230 |
2048位 | 8秒 | 2秒 | 1264 | 1743 | 1122 | 402 |
4096位 | 50秒 | 25秒 | 2304 | 3311 | 2146 | 742 |
无论你使用哪种密钥,真正重要的是密钥长度。鉴于目前的环境,我建议密钥长度为2048。这在今天看来可能是矫枉过正,但我不确定5年后是否会是这样。
至于使用哪种类型的密钥,我不得不倾向于RSA密钥。