跳至主要内容

有时,在讲解如何设置 SSH 的公钥认证系统时,常有人问我:RSA 密钥和 DSA 密钥哪个更好。接下来的几段中,我将尝试回答这个问题。 在展开讨论之前,我需要说明一点:虽然我在以太网局域网和TCP/IP网络方面具备一定专业知识,但在密码学方面,我的理解充其量只能算业余水平。以下讨论基于互联网上的研究资料,其中部分内容存在矛盾,而且就像互联网上的所有信息一样,有些链接比其他链接更可靠。

首先,什么是RSA和DSA密钥?

DSA(数字签名算法)是美国国家安全局(NSA)为数字签名设计的美国政府标准。该算法源自ElGamal签名算法。其安全性基于求解特定类型对数函数的难度。该算法仅可用于数字签名。

RSA 这一名称取自该算法的三位发明者——Ron Rivest、Adi Shamir 和 Leonard Adleman——姓名的首字母缩写。该算法基于分解大数这一难题。与 DSA 不同,RSA 可用于对整条消息进行加密。

据我所知,解决对数问题和因式分解问题难度相当,但我发现有些文献认为对数问题更难(我也发现有些文献认为两者难度相当)。

以下这些事情,我认为并不重要,但你可能已经听说过,或者将来可能会听到:

  1. DSA 的签名速度比 RSA 快,但 RSA 在验证阶段的速度更快;由于身份验证需要这两个阶段,因此这种差异并不重要。
  2. 正如我上面所说,DSA 仅可用于身份验证,而 RSA 既可用于身份验证,也可用于加密消息。不过,SSH 仅将密钥用于身份验证,因此这一区别并不重要。
  3. 对于相同的密钥长度,DSA 生成的签名文件会更小。不过,由于每个密钥都会占用一个磁盘块,因此这一点也不重要。
  4. DSA密钥最初限制为1024位,但现在已不再如此。
  5. 我在“国家漏洞数据库”中搜索了“密钥和DSA”以及“密钥和RSA”,结果发现有2个涉及DSA密钥的漏洞和5个涉及RSA密钥的漏洞。据我所知,这些漏洞已在OpenSSL/OpenSSH的最新版本中得到修复,这些组件现已成为OpenVOS互联网安全包的一部分。

支持DSA的理由:

  1. DSA 仅支持 SSH 2 协议,而 RSA 则支持 1 和 2 两种协议(参见“SSH 2”与“OpenSSL 和 OpenSSH 2 版”)。协议 1 存在一些重大的设计缺陷,已被协议 2 取代。我认为这正是略微倾向于使用 DSA 密钥的原因之一,因为这相当于一种内置的保护机制,可避免使用过时的旧协议。

支持RSA的理由:

  1. 一个糟糕的随机数生成器会泄露 DSA 密钥位(别问我是怎么知道的)。
  2. openssh.org 网站似乎对此问题未置一词,但如果你未指定密钥类型,ssh-keygen 的新版本会自动生成 RSA 密钥。
  3. 似乎引用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密钥。