生成相同 ssh 密钥的机会有多大?

信息安全 密码学 密钥管理 SSH
2021-09-04 06:37:55

我可以在客户端上生成 ssh 密钥,例如(没有密码):

ssh-keygen -b 8192 -t rsa -f /home/THEUSER/.ssh/id_rsa -P '' -v

并将生成的复制id_rsa.pub到服务器:

ssh-copy-id -i /home/THEUSER/.ssh/id_rsa.pub '-p PORTNUMBER SSHUSER@SERVER-IP-ADDRESS'

有人使用 ssh-keygen 生成完全相同的密钥的机会有多大?这样他们也可以在没有密码的情况下登录!

我认为它的机会很小,但我想知道:它是多少?

4个回答

机会比这些事件中的任何一个都低得多:

  • 计算机在密钥生成过程中自发着火。
  • 就在同一秒钟内,英国被一颗坠落的小行星消灭了。
  • 一只从动物园逃出来的流氓大猩猩进入你的客厅并殴打你。
  • 您连续三次在彩票中赢得数百万美元。

所以基本的结论是你不应该担心获得两次相同的 SSH 密钥:这真的不会在你的一生中发生。

从更理论的角度来看,大约有2 8164个可能的 8192 位 RSA 密钥(确实很多)。但是,ssh-keygen将使用伪随机数生成器,该生成器在更精简的内部种子上工作,这取决于操作系统,但通常大小至少为 160 位。这将可能的密钥数量减少到低得多(但仍然很大)的数量2 160即使拥有强大的计算能力(我不是在说一个拥有几十台 PC 的无聊学生;而是想想“谷歌”),经过几年的努力找到相同密钥的概率小于2 -100相比之下,我上面列出的事件可以估计发生的概率大致等于2 -452 -502 -602 -71,分别是:这些可能性要高出数十亿倍。

当然,如果 PRNG 有缺陷,一切都会发生。

首先,阅读生日攻击,这将解释有两个生成完全相同的密钥的巧合和可能性。发生这种情况的几率比你选择一个密钥并查看是否有人生成它的几率要高。(房间里有多少人是在 7 月 7 日出生的,而房间里有多少人是同一天生日。)

现在,任何人生成您的密钥的几率是 1/2^key_size。在公钥加密的情况下,1/2^(bits_of_entropy)。一个 4096 位的 RSA 密钥预计不会有 4096 位的熵。我不确定自己的转换是什么。128 位对称密钥预计具有 128 位熵。(这都忽略了可能会破坏单个回合的攻击等)

现在,这也没有考虑到像非常丑陋的 OpenSSL 错误这样的糟糕实现。

但是,基本上,没有人会偶然生成您的个人密钥,也可能不会通过攻击。

ssh-keygen 使用 OpenSSL 的 libcryptoBN_rand()函数来生成密钥子质的起始点,它本身RAND_bytes()用作随机源。它发生在OpenSSH 源代码分发的gen_candidates()功能中。moduli.c

在大多数平台上,这将是非常好的质量随机性(RAND_bytes()有点依赖于平台;有关更多信息rand_lib.c,请查看 OpenSSL 分发版)。

出于所有实际目的,除非您碰巧使用了一个 libcrypto,其 PRNG 被过分热心和无能的维护者破坏,否则不会发生冲突。

取自研究!rsc

上周,Debian 宣布在 2006 年 9 月,他们在试图消除 Valgrind 警告时意外破坏了 OpenSSL 伪随机数生成器。这样做的一个影响是,安装在最近的 Debian 系统(以及 Debian 衍生系统,如 Ubuntu)上的 ssh-keygen 程序只能生成 32,767 个给定类型和大小的不同可能的 SSH 密钥,所以有很多人四处走动相同的键。

很多人都对他们指指点点,但谁犯了错误并不是很有趣:每个人都会犯错误。有趣的是,这种情况鼓励犯错,并且有可能近两年都没有注意到它。

就像 Jeff Ferland 在之前的一篇文章中所说:“现在,这也没有考虑到糟糕的实现,比如一个非常丑陋的 OpenSSL 错误”(这似乎与上面提到的错误相同)。

“理论上,理论和实践没有区别。在实践中,确实存在。”,Yogi Berra