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