如何检查从 /dev/random 读取是否会阻塞

Zab*_*ula 9 linux random

我找到了/proc/sys/kernel//random/entropy_avail指示/dev/random. 我想检查下一次读取是否/dev/random会阻塞,而我的幼稚方法只是比较entropy_avail所需随机位的数量,但效果不佳。当我做了一个简单愚蠢的实验时,我意识到熵是被缓冲的。64 位熵缓冲区提供 6 字节的随机数据。

我通过这个简单的命令监控了 entropy_avail:

while true
do
    cat /proc/sys/kernel//random/entropy_avail
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

我试图通过命令获得一个随机字节

dd if=/dev/random bs=1 count=1 > /dev/null
Run Code Online (Sandbox Code Playgroud)

dd如果熵为 63 或更低,该命令将被阻止。当熵达到 64 并且我读取一个字节时,熵减少到 0,但我可以在不阻塞的情况下读取另外 5 个字节。然后dd再次阻塞,直到熵达到 64。

entropy_avail 的确切含义是什么,如何检测可用随机位的实数?

Gil*_*il' 12

entropy_avail不表示 中可用的位数/dev/random。它表示核在 RNG 状态下的熵估计,其功率为/dev/random。从数学上讲,这个熵估计是一个毫无意义的量;但是/dev/random如果熵估计太低,Linux 会阻塞。

一个程序从/dev/random块中读取直到 in 的值/proc/sys/kernel/random/entropy_avail大于/proc/sys/kernel/random/read_wakeup_threshold。读取/dev/random以每字节 8 位的速率消耗熵。

但无论如何你不应该使用/dev/random. 您应该使用/dev/urandom,它同样安全,包括用于生成加密密钥,并且不会阻塞。生成随机数不会消耗熵:一旦系统有足够的熵,对宇宙的生命周期都是有益的。操作系统将 RNG 种子保存到文件中,因此一旦系统有足够的熵一次,即使在重新启动后它也有足够的熵。

唯一/dev/urandom不安全的情况是第一次启动的新安装系统,刚刚启动的实时系统(因此从实时系统生成加密密钥不是一个好主意!),或者新 -没有硬件 RNG 或持久内存的启动嵌入式设备。在这样的系统上,等到/dev/random同意释放 16 个字节以确保建立熵池。然后使用/dev/urandom.