如何强制 /dev/random 阻止?

Joh*_*ips 21 cryptography random linux-kernel

对于密码学课程,我试图耗尽 Linux 中的熵池(例如,使/proc/sys/kernel/random/entropy_avail转到 0 并阻止从 读取命令/dev/random),但我无法实现它。我应该从/dev/random块中读取数据。如果我执行这两个命令:

watch -n 0.5 cat /proc/sys/kernel/random/entropy_avail
Run Code Online (Sandbox Code Playgroud)

观察熵,然后:

od -d /dev/random
Run Code Online (Sandbox Code Playgroud)

为了转储随机池,watch命令中的值徘徊在 3700 和 3900 之间,并且在我运行此命令时只有一点点增益和损失。我让这两个命令运行大约三分钟, 的大小没有明显的变化entropy_avail。那段时间我并没有在电脑上做太多事情。通过谷歌搜索,我发现也许硬件随机数生成器可能非常好,以至于熵不会下降,但如果我这样做:

cat /sys/devices/virtual/misc/hw_random/rng_available
Run Code Online (Sandbox Code Playgroud)

我什么也没看到,只看到一个空行。所以我有几个问题:

  1. 是什么给我的熵补充得这么好,我怎样才能找到随机性的具体来源?
  2. 有什么方法可以暂时禁用随机源,以便我可以强制发生这种阻塞?

fro*_*utz 34

Linux 随机设备的开发量令人惊讶。缓慢的阻塞/dev/random已经消失,取而代之的是/dev/random永不耗尽数据的快速。

您必须回到过去,例如 Linux 4.8 之前(引入了更快的 crng 算法)或可能是 Linux 5.6(引入了抖动熵生成)。

无法在当前内核中恢复原始行为。


如果您在旧版本的 Linux 中看到此问题,除了 hwrng 之外,您可能正在使用havegedrng-toolsrngd或类似的用户空间熵提供程序。

一些发行版默认安装这些以避免在等待一些随机位时挂起,在这种情况下,您可以卸载或禁用它们,或者在没有其他进程运行的 initrd / busybox shell 中尝试它。

如果问题仍然存在,您可能只是有一个非常嘈杂的硬件,内核从中不断自然地收集熵。


fuz*_*ngs 21

是什么给我的熵补充得这么好,我怎样才能找到随机性的具体来源?

从内核 5.6 开始,/dev/random从内核的 CRNG 中获取随机性,该 CRNG 在引导期间初始化并且不会阻塞。

请参阅“删除 Linux /dev/random 阻塞池”

有什么方法可以暂时禁用随机源,以便我可以强制发生这种阻塞?

我认为你必须使用 5.6 之前的内核。


CR.*_*CR. 5

这可能取决于您的硬件,如果它使用 CPU 功能,那么它可能是无止境的。其他硬件则不然。

但是,您可以在启动时尝试内核选项 random.trust_cpu=off