我正在使用 PuttyGen 为各种 Windows 计算机生成 ssh 密钥。它需要大量的手动用户输入,特别是在窗口窗格中旋转鼠标的形式。我理解这是必要的,因为 Windows 要么没有像 Linux 那样的随机数生成器,/dev/random
要么 PuttyGen 无法访问它。但这让我开始思考:在一个小区域内旋转鼠标是否足够随机以生成一个好的 SSH-RSA 密钥?我是否应该在 Linux 机器上生成它们并通过闪存驱动器或其他方式将它们移植到 Windows 机器上(尽管存在密钥移动的安全问题)?
PuttyGen 安全吗?
是否在足够随机的小区域内旋转鼠标以生成良好的 SSH-RSA 密钥?
是的。没有人能预测你如何移动鼠标,即使你被要求复制一个图案,你也无法预测。
如果您可以确定您的 Windows 计算机没有感染能够拦截密钥生成的恶意软件,则无需在其他地方生成随机代码。全新安装、断开连接的 Windows 机器就足够安全了。
截至 2019 年,答案似乎只是“我们不知道”。不过,这可能还不错。
这是 Puttygen 生成密钥的方式:
[A] 快速查看 Puttygen 源代码表明它似乎仅根据鼠标移动生成私钥。它用偶数单元格中的鼠标移动事件的时间和奇数单元格中的鼠标位置填充数组,在其上撒上一些魔法洗牌,并以数组作为参数调用一些 RSA/DSA/EC* 密钥生成器。
在寻找支持或反驳鼠标移动不可预测性的证据时,我一无所获。似乎没有人对这个话题进行过任何研究。
目前,我建议使用我们非常有信心确保安全的方法。现代操作系统提供这些(/dev/urandom
在 Linux 和CryptGenRandom
Microsoft Windows 中),因为必须从系统源收集熵。单个程序产生适当随机性的机会要少得多,因此软件应该使用系统的随机性源。类似的软件就是这样ssh-keygen
做的。
这归结为鼠标运动中有多少熵以及如何消化它以提供密钥。
我发现这篇文章讨论了鼠标移动实验。它使用了以不规则间隔采样的平滑鼠标运动,当然这些间隔被四舍五入到整个像素。结果表明,这导致加速度的高斯分布,每个事件只有几位熵。它估计几秒钟的运动会产生 128 位的熵。
那篇文章中的实验值得注意的是,它只是基于平滑运动。PuttyGen 让您左右摇摆鼠标。这将给出一些不可预测的值。如果您有成千上万的志愿者摆动鼠标并通过 SHA256 运行每个跟踪,您就不会期望任何可预测性。
另一个答案说 PuttyGen 通过加密密钥生成器算法运行其鼠标跟踪。我们可以期望它可以很好地利用迹线中的熵。所以这似乎是一个令人满意的方法。
更新在我看来,我们习惯于使用应用程序,/dev/urandom
因此 PuttyGen 使用鼠标移动似乎很可疑。然而,很少有系统具有硬件随机数生成器伪随机数的标准机制是从设备驱动程序中采样噪声然后散列。鉴于对平滑的鼠标移动进行采样会产生噪音,并且用户摇摆它会产生不可预测性,PuttyGen 只是在做与典型的安全随机数生成器等效的事情。为什么?要么他们不相信 windows 可以做 Linux 所做的事情,要么他们不相信 windows 可以对攻击者隐藏官方随机数,或者他们怀疑攻击者可能能够用一个可预测的来源替换官方来源。在很多情况下,用户可能不会费心帮助生成不可观察的伪随机数。因此,PuttyGen 是高度偏执场景的一个特例,最终用户将投入时间和精力来获取安全密钥。