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

如何检查从 /dev/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

我试图通过命令获取随机字节

dd if=/dev/random bs=1 count=1 > /dev/null

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

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

答案1

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.

相关内容