从 /dev/random 和 /dev/urandom 读取的每个字节大约包含多少位熵?/dev/random 中的数据使用内核随机数生成器,而 /dev/urandom 使用 CPRNG,因此尽管从每个字节读取的字节数可能相同,但从每个字节读取的实际熵量并不相同。
是否有任何最佳实践和/或研究可以估计从这些源读取的每个数据字节通常包含多少熵?
例如,如果我需要 80 位熵来获取安全令牌,并且该令牌是通过从 dev/urandom 读取数据生成的,并且如果我知道从 /dev/urandom 读取的每个字节数据大约包含 4 位熵,那么我可以读取 20 个字节的数据并使用哈希函数来生成令牌。
答案1
只要 CPRNG 正确播种,/dev/random
并且/dev/urandom
没有可察觉的行为差异。这就像水和圣水之间的区别——制作它们的方式不同,但没有测试可以区分两者。
从单个 CPRNG 获取更多字节的数据并对其进行哈希处理毫无意义。这正是 CPRNG 内部已经完成的工作。
答案2
手册页包含有关和 的man 4 random
大量有用信息。/dev/random
/dev/urandom
如果我理解正确的话,这个想法是,只要系统中的整体熵足够高,那就无关紧要了:从中获取/dev/urandom
比熵更多的数据应该不是问题,因为利用“实际熵”这一事实(例如,您使用的 2000 位)只有 512 位,就需要破解 CPRNG 或猜测 512 位,而这仍然比暴力破解方法所能做的要多得多。
如果您实际上想测量使用这两个设备中的任何一个的数据对熵池的影响,您可以读取的内容/proc/sys/kernel/random/entropy_avail
,其中包含当前的熵位数:
cat /proc/sys/kernel/random/entropy_avail