/dev/random 在 Ubuntu for Windows 10 (WSL) 中非常慢

Chr*_*s_F 11 random windows-subsystem-for-linux

我在 Haswell 笔记本电脑上使用适用于 Windows 10 (WSL2) 的 Ubuntu 20.04,每秒获得大约 0.6 个字节。等待 10 秒后总共 6 个字节。这是无法接受的。问题是什么?

编辑:这似乎只是在 WSL2 模式下运行时的问题。WSL1 = 40MiB/s WSL2 = 0.6 字节/s

bk2*_*204 30

无论/dev/random/dev/urandom在Linux中的密码安全伪随机数生成器。在旧版本的 Linux 内核中,/dev/random一旦初始化就会阻塞,直到积累了足够的额外熵,而/dev/urandom不会。由于 WSL2 是具有真实 Linux 内核的虚拟机,因此它具有一组有限的熵源,可以从中提取熵,并且其大部分熵必须依赖于主机系统。但是,只要它在启动时接收到足够的熵,就可以安全地使用 CSPRNG。

听起来在您的环境中,CSPRNG 已在从 Windows 启动时播种,但未以高速率重新播种。这很好,但它会导致/dev/random比您想要的更频繁地阻塞。归根结底,这是WSL2的配置问题。

WSL1 可能没有这个问题,因为在这种情况下,它/dev/random可能不会阻塞并且只使用系统 CSPRNG,例如/dev/urandom. 在更新的 Linux 版本中,唯一的/dev/random阻塞时间是启动时没有积累足够的熵来为 CSPRNG 播种一次;否则,它完全等价于/dev/urandom。做出此决定是因为如果池已适当初始化,则两个接口中没有合理的安全差异。

由于在这些情况下没有可测量的差异,如果/dev/random阻塞并且对您来说太慢,正确的做法是使用/dev/urandom,因为它们是相同 CSPRNG(基于 ChaCha20)的输出。无论如何,上游 Linux 行为很可能是 WSL2 未来版本中的默认行为,因为 Microsoft 最终将合并更新版本的 Linux。

  • 两者都是 CSPRNG,并且都以相同的速率重新播种熵。即使状态被破坏,很明显,在 30 秒后,在您的系统上,池中的熵将达到 128 位或更多,这就足够了,池将被重新播种。密码学家推荐`/dev/urandom` 或`getrandom(2)` 用于所有目的,所以没有理由使用`/dev/random`。许多非 Linux 操作系统甚至从来没有阻塞过 `/dev/random`。 (8认同)
  • 如果它每 10 秒释放 6 个字节,那么它就不能安全地重新播种,因为 48 位的熵是非常容易猜测的,所以在妥协后暴露输出的 6 个字节的熵是不安全的,你也不会更好。无论如何,您确实问过为什么会发生这种行为以及为什么 WSL1 和 WSL2 之间存在这种差异,所以我想我已经回答了这个问题。 (4认同)
  • 据我了解,密码学家推荐非阻塞版本,因为 (a) 他们检查计算安全性假设秘密不会泄漏,以及 (b) 他们不希望糟糕的用户体验导致更差的安全性。这两个都是有效的,我同意它们——我*不是*说你应该使用`/dev/random`本身;由于这些原因,大多数用例可能应该使用`/dev/urandom`。我只是说这些与声称两者之间没有安全差异的说法不同*。在我看来,区别就在那里;在典型应用程序中进行权衡是不值得的。 (3认同)
  • @Joshua:我认为这是因为他们对 CPU RNG 的信任度不足,无法将所有鸡蛋都放在那个篮子里。 (3认同)
  • @PeterCordes:取决于您连接到其他服务器的速度以及补充熵的速度。对于访问网站的用户来说,它可能不会泄露该网站之外的任何内容(尽管希望在访问期间与第 3 方域的连接不会受到损害)。对于网络密集型服务器,我不太确定;这可能归结为他们是否信任他们的硬件 RNG。但同样,我并不是说这对普通用户或普通应用程序很重要。正如我们都同意的那样,大多数应用程序应该使用`/dev/urandom`。 (2认同)

小智 5

我自己还没有在 WSL2 Ubuntu 中对此进行过测试,但不久前我在 CentOS 6 虚拟机上遇到了类似的问题。安装和运行该haveged服务解决了我的 /dev/random 缓慢问题。也许值得尝试一下。

Linux 通过 /dev/random 和 /dev/urandom 设备接口汇集随机性以进行分发。填充 /dev/random 池的标准机制可能不足以满足对具有高需求或有限用户交互的系统的需求。在这些情况下,只要 /dev/random 中的随机位供应低于设备的低水位线,haged 就可以作为特权守护进程运行以填充 /dev/random 池。

https://manpages.ubuntu.com/manpages/focal/man8/haveged.8.html

否则,就像@bk2204 所说的, /dev/urandom 可能是你最好的选择。