有时,在讲解如何设置 SSH 的公钥认证系统时,常有人问我:RSA 密钥和 DSA 密钥哪个更好。接下来的几段中,我将尝试回答这个问题。 在展开讨论之前,我需要说明一点:虽然我在以太网局域网和TCP/IP网络方面具备一定专业知识,但在密码学方面,我的理解充其量只能算业余水平。以下讨论基于互联网上的研究资料,其中部分内容存在矛盾,而且就像互联网上的所有信息一样,有些链接比其他链接更可靠。
首先,什么是RSA和DSA密钥?
DSA(数字签名算法)是美国国家安全局(NSA)为数字签名设计的美国政府标准。该算法源自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密钥的RFC比引用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位的密钥长度。虽然在今天看来这可能有些过头,但我不敢确定五年后是否依然如此。
至于该使用哪种密钥,我倾向于选择RSA密钥。
