我正在使用/dev/urandom为我的程序生成随机数据。我了解到/dev/random可以为空,因为与/dev/urandom不同,当没有足够的字节生成时,它不使用SHA。/dev/random使用“内核熵池”。显然,它依赖于键盘计时,鼠标移动和IDE计时。但这到底是怎么回事呢?难道不可能“喂养”熵池,使/dev/random输出可预测吗?
/dev/urandom
/dev/random
mqkwyuun1#
一些附加信息:
中断是指鼠标、键盘等设备异步发送的信号。
vcirk6k62#
你说的是对的。是的,理论上可以将熵输入到/dev/random中,但是你需要控制很多内核“噪声”源才能让它变得重要。你可以查看random.c的源,看看/dev/random从哪里获取噪声。基本上,如果你控制了大量的噪声源,那么你就可以猜到其他人对熵池的贡献。由于/dev/urandom是/dev/random的Hash chain种子,如果你知道种子,那么你实际上可以预测下一个数字。如果你对熵池有足够的控制,那么从/dev/urandom的输出中,你可能能够猜测这个种子,这将使你能够预测/dev/urandom的所有下一个数字,但是只有当你保持/dev/random耗尽时,否则/dev/urandom将被重新设定种子。话虽如此,我还没有看到任何人真正做到这一点,即使是在一个受控的环境。当然,这不是一个保证,但我不会担心。因此,我宁愿使用/dev/urandom并保证我的程序在等待熵时不会阻塞,而不是使用/dev/random并要求用户做一些愚蠢的事情,比如移动鼠标或敲击键盘。我想你应该读一读LWN的On entropy and randomness,希望它能平息你的担忧:-)。如果你仍然担心,那么给自己买一个HRNG。
编辑这里有一个关于熵的小注解:
我认为熵的概念一般很难掌握。在Wikipedia上有一篇文章提供了更多信息。但基本上,在这种情况下,你可以将熵读为随机性。所以我的看法是,你有一个装满彩球的大袋子,这个袋子里的熵越高,就越难预测从袋子里抽出来的下一种颜色。在这种情况下,你的熵池只是一堆随机字节,其中一个不能从前面的字节或任何其他字节中导出,这意味着你有高熵。
zz2j4svz3#
我很欣赏jbr回答的深度。添加一个实用的更新,为任何人目前盯着一个ipsec的pki命令或类似的阻塞在空熵池:我刚刚在另一个窗口中安装了rng-tools,我的pki命令完成了。
apt-get install rng-tools
uqzxnwby4#
我正在factorable上阅读一篇论文,并注意到其中的一节:“对于库开发人员:默认为最安全的配置。OpenSSL和Dropbear都默认使用/dev/urandom而不是/dev/random,Dropbear默认使用安全性较低的DSA签名随机性技术,即使可以选择更安全的技术。”作者解决了应用程序在等待熵构建/dev/random时挂起的权衡,以获得更好的安全性,而不是快速但不太安全的/dev/urandom结果。
OpenSSL
Dropbear
4条答案
按热度按时间mqkwyuun1#
一些附加信息:
中断是指鼠标、键盘等设备异步发送的信号。
vcirk6k62#
你说的是对的。是的,理论上可以将熵输入到
/dev/random
中,但是你需要控制很多内核“噪声”源才能让它变得重要。你可以查看random.c的源,看看/dev/random
从哪里获取噪声。基本上,如果你控制了大量的噪声源,那么你就可以猜到其他人对熵池的贡献。由于
/dev/urandom
是/dev/random
的Hash chain种子,如果你知道种子,那么你实际上可以预测下一个数字。如果你对熵池有足够的控制,那么从/dev/urandom
的输出中,你可能能够猜测这个种子,这将使你能够预测/dev/urandom
的所有下一个数字,但是只有当你保持/dev/random
耗尽时,否则/dev/urandom
将被重新设定种子。话虽如此,我还没有看到任何人真正做到这一点,即使是在一个受控的环境。当然,这不是一个保证,但我不会担心。
因此,我宁愿使用
/dev/urandom
并保证我的程序在等待熵时不会阻塞,而不是使用/dev/random
并要求用户做一些愚蠢的事情,比如移动鼠标或敲击键盘。我想你应该读一读LWN的On entropy and randomness,希望它能平息你的担忧:-)。
如果你仍然担心,那么给自己买一个HRNG。
编辑这里有一个关于熵的小注解:
我认为熵的概念一般很难掌握。在Wikipedia上有一篇文章提供了更多信息。但基本上,在这种情况下,你可以将熵读为随机性。
所以我的看法是,你有一个装满彩球的大袋子,这个袋子里的熵越高,就越难预测从袋子里抽出来的下一种颜色。
在这种情况下,你的熵池只是一堆随机字节,其中一个不能从前面的字节或任何其他字节中导出,这意味着你有高熵。
zz2j4svz3#
我很欣赏jbr回答的深度。
添加一个实用的更新,为任何人目前盯着一个ipsec的pki命令或类似的阻塞在空熵池:
我刚刚在另一个窗口中安装了rng-tools,我的pki命令完成了。
uqzxnwby4#
我正在factorable上阅读一篇论文,并注意到其中的一节:
“对于库开发人员:默认为最安全的配置。
OpenSSL
和Dropbear
都默认使用/dev/urandom
而不是/dev/random
,Dropbear
默认使用安全性较低的DSA签名随机性技术,即使可以选择更安全的技术。”作者解决了应用程序在等待熵构建
/dev/random
时挂起的权衡,以获得更好的安全性,而不是快速但不太安全的/dev/urandom
结果。