linux 内核熵池是如何工作的?

r3i60tvu  于 2023-03-22  发布在  Linux
关注(0)|答案(4)|浏览(205)

我正在使用/dev/urandom为我的程序生成随机数据。我了解到/dev/random可以为空,因为与/dev/urandom不同,当没有足够的字节生成时,它不使用SHA。/dev/random使用“内核熵池”。显然,它依赖于键盘计时,鼠标移动和IDE计时。
但这到底是怎么回事呢?
难道不可能“喂养”熵池,使/dev/random输出可预测吗?

mqkwyuun

mqkwyuun1#

一些附加信息:

  • IRQF_SAMPLE_RANDOM*:此中断标志指定设备生成的中断应贡献给内核熵池

中断是指鼠标、键盘等设备异步发送的信号。

vcirk6k6

vcirk6k62#

你说的是对的。是的,理论上可以将熵输入到/dev/random中,但是你需要控制很多内核“噪声”源才能让它变得重要。你可以查看random.c的源,看看/dev/random从哪里获取噪声。基本上,如果你控制了大量的噪声源,那么你就可以猜到其他人对熵池的贡献。
由于/dev/urandom/dev/randomHash chain种子,如果你知道种子,那么你实际上可以预测下一个数字。如果你对熵池有足够的控制,那么从/dev/urandom的输出中,你可能能够猜测这个种子,这将使你能够预测/dev/urandom的所有下一个数字,但是只有当你保持/dev/random耗尽时,否则/dev/urandom将被重新设定种子。
话虽如此,我还没有看到任何人真正做到这一点,即使是在一个受控的环境。当然,这不是一个保证,但我不会担心。
因此,我宁愿使用/dev/urandom并保证我的程序在等待熵时不会阻塞,而不是使用/dev/random并要求用户做一些愚蠢的事情,比如移动鼠标或敲击键盘。
我想你应该读一读LWN的On entropy and randomness,希望它能平息你的担忧:-)。
如果你仍然担心,那么给自己买一个HRNG

编辑这里有一个关于熵的小注解:

我认为熵的概念一般很难掌握。在Wikipedia上有一篇文章提供了更多信息。但基本上,在这种情况下,你可以将熵读为随机性。
所以我的看法是,你有一个装满彩球的大袋子,这个袋子里的熵越高,就越难预测从袋子里抽出来的下一种颜色。
在这种情况下,你的熵池只是一堆随机字节,其中一个不能从前面的字节或任何其他字节中导出,这意味着你有高熵。

zz2j4svz

zz2j4svz3#

我很欣赏jbr回答的深度。
添加一个实用的更新,为任何人目前盯着一个ipsec的pki命令或类似的阻塞在空熵池:
我刚刚在另一个窗口中安装了rng-tools,我的pki命令完成了。

apt-get install rng-tools
uqzxnwby

uqzxnwby4#

我正在factorable上阅读一篇论文,并注意到其中的一节:
“对于库开发人员:默认为最安全的配置。OpenSSLDropbear都默认使用/dev/urandom而不是/dev/randomDropbear默认使用安全性较低的DSA签名随机性技术,即使可以选择更安全的技术。”
作者解决了应用程序在等待熵构建/dev/random时挂起的权衡,以获得更好的安全性,而不是快速但不太安全的/dev/urandom结果。

相关问题