我理解/ dev/urandom吗?

Tow*_*wer 67 unix linux random cryptography

我一直在阅读/dev/urandom,据我所知,/dev/random通过利用网络数据包时序等几个事件来创建加密随机数.但是,我是否理解/dev/urandom使用PRNG,播种数字来自/dev/random?或者/dev/random只要有比特就可以使用它- 当它们用尽时它会回到一些PRNG,从那里收集种子?

Lie*_*yan 93

urandom联机帮助页:

随机数发生器将来自设备驱动程序和其他源的环境噪声收集到熵池中.生成器还保持对熵池中的噪声位数的估计.从该熵池中创建随机数.

读取时,/ dev/random设备仅返回熵池中估计的噪声位数内的随机字节./ dev/random应该适用于需要非常高质量随机性的用途,例如一次性密钥或密钥生成. 当熵池为空时,来自/ dev/random的读取将阻塞,直到收集到额外的环境噪声.

从/ dev/urandom设备读取不会阻止等待更多的熵.结果,如果熵池中没有足够的熵,则理论上返回的值易受对驱动程序使用的算法的加密攻击.目前未分类的文献中没有关于如何做到这一点的知识,但理论上可能存在这样的攻击.如果这是您的应用程序中的问题,请改用/ dev/random.

两者都使用PRNG,尽管使用环境数据和熵池使得它在天文学上更难以破解PRNG,并且在不收集完全相同的环境数据的情况下也是不可能的.

根据经验,如果没有从量子事件中收集数据的专门昂贵的硬件,就没有真正的随机数发生器(即产生真正不可预测数量的RNG); 虽然出于加密目的,/ dev/random或/ dev/urandom就足够了(使用的方法是CPRNG,加密伪随机数生成器).

使用/ dev/random的熵池和阻塞读取作为安全防护,以确保不可能预测随机数; 例如,如果一个攻击者耗尽了系统的熵池,那么尽管今天的技术极不可能,他可以预测/ dev/urandom的输出很长一段时间没有被重新接种(尽管如此)这也需要攻击者耗尽系统收集更多熵的能力,这也是天文数据不可思议的.

  • @Lie,那么操作系统在哪里存储“/dev/random”位?它们存储的这些位的数量有限制吗? (2认同)

Tho*_*nin 31

实际上你在实践中需要的是FreeBSD /dev/urandom提供的内容:它将读取足够长度的初始种子/dev/random,然后使用PRNG.因此,它可能最初阻塞(刚刚在系统启动之后)但是一旦它收集了足够的熵,它就永远不会阻塞.这提供了大多数加密协议所需的随机性级别,而不是过度阻塞.

Linux /dev/urandom是类似的,除了它永远不会阻塞,因此如果在启动后使用,可能会有返回低质量随机性的风险.另一方面,/dev/random甚至可能在启动时间之后很长时间阻塞,这也是一个问题.我经常看到服务器神秘失速,因为有些软件坚持使用/dev/random,而无键盘服务器没有获得足够的熵.

通常的Linux发行版会在关机时保存从中获取的随机种子/dev/urandom,并在下次引导时将其注入,从而保证了随机提供的随机质量/dev/urandom.只有在操作系统安装过程中,加密质量才会成为一个问题,而且通常不是因为安装涉及与执行安装的人进行多次交互,从而产生大量的熵.

总而言之,在Linux和FreeBSD下,你应该使用/dev/urandom,而不是/dev/random.

  • @Demetri - 您刚才说/ dev/urandom不如自身安全. (8认同)
  • no/dev/urandom不如/ dev/urandom安全,因为/ dev/urandom在没有熵的情况下不会阻塞 (2认同)
  • 现在Linux为此目的有一个[`getrandom`](http://man7.org/linux/man-pages/man2/getrandom.2.html)系统调用.:) (2认同)

zan*_*ngw 8

引用这里

/dev/random将在熵池耗尽后阻塞.它将保持阻塞状态,直到从可用的熵源收集到其他数据.这可以减慢随机数据的生成速度.

/dev/urandom不会阻止.相反,它将重用内部池以产生更多的伪随机位.


/dev/urandom 最适合用于:

  • 您只需要一个包含随机数据的大文件进行某种测试.
  • 您正在使用该dd命令通过将数据替换为随机数据来擦除磁盘上的数据.
  • 几乎在其他任何你没有充分理由使用的地方/dev/random.

/dev/random 在以下情况下可能是更好的选择:

  • 随机性对于应用程序中的加密安全性至关重要 - 一次性密钥,密钥生成.