从/ dev / random和/ dev / urandom读取每个字节的熵有多less位?

从/ dev / random和/ dev / urandom读取的每个字节中大约包含多less熵? 来自/ dev / random的数据使用内核随机数生成器,而/ dev / urandom使用CPRNG,因此虽然从每个读取的字节数可能相同,但从每个读取的实际熵的数量将不相同。

是否有最佳实践和/或研究来估计从这些数据源读取的每个字节数据中通常包含多less熵?

例如,如果我需要80位熵作为安全令牌,并且通过从dev / urandom读取数据来生成令牌,并且如果我知道从/ dev / urandom读取的每个字节数据将包含约4位熵,我可以读取20个字节的数据,并使用散列函数来生成令牌。

只要CPRNG被正确接种, /dev/random/dev/urandom在行为上没有可察觉的差异。 就像水和圣水之间的区别 – 你做的方式有所不同,但没有一个testing可以从另一个testing中看出来。

从单个CPRNG中获取更多字节的数据并散列它们是没有意义的。 这正是CPRNG在内部所做的。

手册页man 4 random包含了很多关于/dev/random/dev/urandom的有用信息。

如果我理解正确的话,这个想法是,只要系统中的整体熵足够高,那么从/dev/urandom比熵更多的数据就不成问题,因为利用例如2000比特的“实际熵”只有512比特这一事实需要中断CPRNG或者猜测512比特,这比通过powershell方法所做的还要多。

如果你真的想要测量在熵池上使用这两个设备中任何一个的数据的效果,你可以读取包含当前熵位数的/proc/sys/kernel/random/entropy_avail内容:

 cat /proc/sys/kernel/random/entropy_avail