受密码保护的 SSH 私钥是否容易受到字典攻击?

信息安全 SSH RSA 密码
2021-08-12 05:23:09

如果我有一个受密码保护的 SSH 私钥,

如果此密码足够随机且足够长(例如,20、30、40 个字符长,甚至更多!),

如果我在网上公开我的这个私钥

然后,

某人实际上是否有可能从其相应的公钥中解密我的私钥(后者无论如何都是公开的)。

答案很可能是:

“解密工作和所花费的时间将完全取决于所选密码的长度和随机性,并且 SSH 身份验证算法/协议中没有任何固有的东西会加速或减慢解密工作。因此,在当前状态下 - of-decryption-art,一个 20 多个字符长的密码应该足够了。即使是 Gmail 等人也建议使用长度更小的密码。

但我不确定这是否是正确的答案,或者是否还有其他方面需要我担心,等等。

如果这个 SSH 私钥实际上是不可解密的,那么我打算用一个很长的密码来保护它,然后忘记所有关于保护密钥本身的事情。例如,我可以将它存储在我的 Gmail 收件箱中(甚至让 Gmail 团队看到它),甚至可以将它上传到我的个人网站上以便我轻松检索(例如,当我旅行时)。等等。

4个回答

重要的不是密码的长度,而是它的随机性;也就是说,它可能会有多大的不同。长度为随机性腾出空间,但不会产生随机性。

SSH 私钥的对称加密设计得不是很好;它依赖于 OpenSSL 的一些旧功能,这些旧功能可以追溯到密码散列是一个正确理解的问题之前。有关详细分析,请参阅此答案底线是攻击者将能够以每秒十亿的速度尝试潜在的密码,除非您投入一些精力将您的密钥包装在 PKCS#8 对象中,并使用 PBKDF2 和足够的轮次。

如果您将密码短语生成为一系列字母,每个字母随机且均匀地选择,您将获得每个字母 4.7 位的熵(因为 26 大约等于 2 4.7)。要达到合适的保护级别(例如 100 位),您将需要 22 个字母……如果您更喜欢生成有意义的单词,例如在 2048 个“常用单词”列表中,那么每个单词您将获得 11 位,并且9 个单词会让你得到 99 位熵。同样,每个单词必须随机、统一且独立于其他单词选择。

使用 PKCS#8 + PBKDF2 和一百万轮(OpenSSL 需要一些哄骗来产生它),您可以获得 20 位(因为 2 20大约等于一百万)。

记住,确实,记住可能很棘手。您会记住一个很长的密码,但前提是您输入得足够频繁。如果你不这样做,那么几乎可以保证健忘。我建议您打印很长的密码并将其存储在银行保险箱中(使用激光打印机打印,而不是喷墨打印机:后者的墨水会很快消失)。或者,更简单的是,剪掉中间人并将钥匙本身打印在您放入银行保险箱的纸上。

(*) 注意:打印系统可能会保留过去打印作业的缓存副本。删除所有痕迹可能很棘手。你可以用笔和你的手使用“手动打印”过程......为了真正长时间储存​​,考虑在石头或一些防锈金属上雕刻。

这是一个非常有趣的话题。以前在 Stack Exchange 上已经回答过的问题。Bruce Schneier 是公认的密码学专家。您可以在此处找到有关蛮力攻击的文章:

为什么不使用更大的密钥?

这里转载了最有趣的段落:

更长的密钥长度更好,但仅在一定程度上。AES 将具有 128 位、192 位和 256 位密钥长度。这比可预见的未来需要的时间要长得多。事实上,我们甚至无法想象一个可以进行 256 位暴力搜索的世界。它需要在物理学和我们对宇宙的理解方面取得一些根本性的突破。

热力学第二定律的结果之一是表示信息需要一定的能量。通过改变系统状态来记录单个位需要不少于 kT 的能量,其中 T 是系统的绝对温度,k 是玻尔兹曼常数。(坚持我;物理课快结束了。)

假设 k = 1.38 × 10 -16 erg/K,并且宇宙的环境温度为 3.2 Kelvin,一台运行在 3.2 K 的理想计算机每次设置或清除一个位时将消耗 4.4 × 10 -16 ergs。要运行比宇宙背景辐射更冷的计算机,需要额外的能量来运行热泵。

现在,我们太阳的年能量输出约为 1.21 × 10 41尔格。这足以在我们的理想计算机上驱动大约 2.7 × 10 56 个单位的变化;足够的状态更改以将 187 位计数器置于其所有值中。如果我们在太阳周围建造一个戴森球,并在 32 年内毫无损失地捕获其所有能量,我们可以为计算机提供动力,使其数到 2 192当然,它不会有剩余的能量来使用这个计数器进行任何有用的计算。

但这只是一颗星,而且是微不足道的一颗。典型的超新星会释放 10 51尔格。(大约一百倍的能量将以中微子的形式释放,但现在让它们离开吧。)如果所有这些能量都可以引导到一个单一的计算狂欢中,一个 219 位的计数器可以循环遍历所有其状态。

这些数字与设备的技术无关;它们是热力学允许的最大值。他们强烈暗示,在计算机不是由物质以外的东西构成并占据空间以外的东西之前,对 256 位密钥的暴力攻击将是不可行的。

我希望你对此感兴趣。

如果这个 SSH 私钥实际上是不可解密的,那么我打算用一个很长的密码来保护它,然后忘记所有关于保护密钥本身的事情。

如果攻击者可以得到您的加密私钥,加密私钥很容易受到暴力攻击。如果他不能,那么他们就不能。加密并不神奇。它通常是非常普通的三重DES,并且总是离线攻击,因此攻击者可以自由使用专用硬件。

将加密密钥放入 Gmail 邮箱或 Google Drive 或 Dropbox 可能就足够安全了。对您的密钥感兴趣的人员列表与有权访问您的 Gmail 帐户的人员列表没有太多重叠。

但是在您的网页上公开显示它有点过分了。您实际上是在要求某人尝试破解它。至少采取措施防止临时观察者进入。

一个 20 个字符的字母数字密码大约是 120 位,当今的技术不能轻易地暴力破解。但即便如此,可能还是需要一点常识。

这是一个老问题,但如果有人遇到这个寻找答案,事情已经发生了变化

 -o      Causes ssh-keygen to save private keys using the new OpenSSH
         format rather than the more compatible PEM format.  The new
         format has increased resistance to brute-force password cracking
         but is not supported by versions of OpenSSH prior to 6.5. Ed25519
         keys always use the new private key format.

(来自 ssh-keygen 手册页)

显然,这使用bcrypt了 ,这被认为是一个不错的缓慢而强大的 KDF 。虽然它的固定内存使用使其更容易受到使用 GPU、FPGA 或 ASIC 的大规模并行攻击而不是类似的东西scrypt(可以调整为需要任意数量的内存来计算),但它在单轮 MD5 方面领先于旧格式用途。

此外,您可以使用-a选项指定使用的工作因子,可用于进一步大幅提高密钥文件的暴力抗性。这值得尝试以找到最高的容许值;我使用了 200,在我旧的第二代移动 i7 上需要大约 2 秒才能解密。

作为参考,以下是 2017 年顶级破解设备的基准测试:在 8 个顶级 GPU 上约 10 万次猜测/秒。这是 bcrypt 工作因数为 5,远低于 OpenSSH 使用的(我相信默认为 16?(它是指数规模;将工作因数增加 1 会使哈希时间加倍-a)并且实际的 bcrypt 工作因子尚不清楚。)