我找到了/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
.