对于密码学课程,我试图耗尽 Linux 中的熵池(例如,使/proc/sys/kernel/random/entropy_avail
转到 0 并阻止从 读取命令/dev/random
),但我无法实现它。我应该从/dev/random
块中读取数据。如果我执行这两个命令:
watch -n 0.5 cat /proc/sys/kernel/random/entropy_avail
观察熵,然后:
od -d /dev/random
为了转储随机池,命令中的值watch
徘徊在 3700 和 3900 之间,并且在我运行此命令时只有一点点增益和损失。我让这两个命令运行大约三分钟, 的大小没有明显的变化entropy_avail
。那段时间我并没有在电脑上做太多事情。通过谷歌搜索,我发现也许硬件随机数生成器可能非常好,以至于熵不会下降,但如果我这样做:
cat /sys/devices/virtual/misc/hw_random/rng_available
我什么也没看到,只看到一个空行。所以我有几个问题:
- 是什么给我的熵补充得这么好,我怎样才能找到随机性的具体来源?
- 有什么方法可以暂时禁用随机源,以便我可以强制发生这种阻塞?
答案1
Linux 随机设备的开发量令人惊讶。缓慢、阻塞的情况消失了,取而代之的是永不耗尽数据的/dev/random
快速。/dev/random
你必须回到过去,比如 linux 4.8 之前(引入了更快的 crng 算法)或者可能是linux 5.6(引入了抖动熵生成)。
无法在当前内核中恢复原始行为。
如果您在旧版本的 Linux 中看到此问题,除了 hwrng 之外,您可能正在使用haveged
rng-toolsrngd
或类似的用户空间熵提供程序。
一些发行版默认安装这些以避免在等待一些随机位时挂起,在这种情况下,您可以卸载或禁用它们,或者在没有其他进程运行的 initrd / busybox shell 中尝试它。
如果问题仍然存在,您可能只是有一个非常嘈杂的硬件,内核从中不断自然地收集熵。
答案2
是什么给我的熵补充得这么好,我怎样才能找到随机性的具体来源?
从内核 5.6 开始,/dev/random
从内核的 CRNG 中获取随机性,该 CRNG 在引导期间初始化并且不会阻塞。
有什么方法可以暂时禁用随机源,以便我可以强制发生这种阻塞?
我认为你必须使用 5.6 之前的内核。
答案3
这可能取决于您的硬件,如果它使用 CPU 功能,那么它可能是无止境的。其他硬件则不然。
不过,您可以尝试内核选项 random.trust_cpu=off
开机时。