随机和随机的差异

时间:2014-05-17 14:41:36

标签: random prng

我试图找出/dev/random/dev/urandom个文件之间的差异

  1. /dev/random/dev/urandom之间有什么区别?
  2. 我什么时候应该使用它们?
  3. 什么时候不应该使用它们?

4 个答案:

答案 0 :(得分:38)

使用/dev/random可能需要等待结果,因为它使用所谓的熵池,此时可能无法获得随机数据。

/dev/urandom返回用户请求的字节数,因此它的随机性低于/dev/random

从手册页中可以看到:

<强>随机

  

读取时,/dev/random设备只返回其中的随机字节   熵池中估计的噪声比特数。 /dev/random   应适用于需要非常高质量随机性的用途   例如一次性垫或密钥生成。当熵池是   空,从/dev/random读取将阻止直到另外   收集环境噪音。

<强> urandom的

  

来自/dev/urandom设备的读取不会阻止等待更多   熵。结果,如果没有足够的熵   熵池,返回值理论上容易受到影响   对驱动程序使用的算法进行加密攻击。知识   如何执行此操作在当前未分类中不可用   文献,但理论上可能是这样的攻击   存在。如果这是您的应用程序中的问题,请使用/dev/random   代替。

出于加密目的,您应该使用/dev/random,因为它返回的数据的性质。为了安全起见,可能的等待应被视为可接受的权衡,IMO。

当您需要随机数据快速时,您当然应该使用/dev/urandom

来源:Wikipedia页面,man页面

答案 1 :(得分:22)

始终使用/ dev / urandom。

/ dev / urandom和/ dev / random使用相同的随机数生成器。它们都由相同的熵池播种。它们都会给出一个任意大小的随机数。它们都可以提供无限量的随机数,只有256位种子。只要初始种子具有256位熵,就可以无限量地提供任意长的随机数。使用/ dev / random没有任何好处。事实上,有两个设备是Linux API中的一个缺陷。

如果你担心熵,使用/ dev / random不会解决这个问题。但它会减慢你的应用程序,而不会产生比/ dev / urandom更随机的数字。如果你不关心熵,你为什么要使用/ dev / random?

这里有一个更好/深入的解释,为什么你应该总是使用/ dev / urandom:http://www.2uo.de/myths-about-urandom/

答案 2 :(得分:5)

  

/dev/random/dev/urandom之间有什么区别?

/dev/random/dev/urandom是内核随机数生成器的接口:

  • 读取返回足够强大的随机字节流以用于加密
  • 写入它们将提供内核数据来更新熵池

当涉及到差异时,它取决于操作系统:

  • 在Linux上,从/dev/random读取可能会阻止,这实际上限制了它在实践中的使用
  • 在FreeBSD上,没有。 /dev/urandom只是/dev/random的符号链接。
  

我什么时候应该使用它们?   我什么时候不应该使用它们?

很难找到一个用/dev/random超过/dev/urandom的用例。

阻止的危险:

  • 当您决定使用/dev/random时,这是一个您必须面对的真正问题。对于像ssh-keygen这样的单一用法,可以等待几秒钟,但对于大多数其他情况,它将不是一个选项。
  • 如果您使用/dev/random,则应以非阻止模式打开它,如果无法立即获得所需的熵,则会提供某种用户通知。

安全

  

/dev/random接口被视为传统接口,/dev/urandom是首选且充足的接口          所有用例,但在早期启动时需要随机性的应用程序除外;对于          这些应用程序必须使用getrandom(2),因为它将阻塞,直到初始化熵池。

     

如果种子文件在重新启动时保存,如下所示(所有主要Linux发行版都已完成此操作)          至少自2000年以来,输出对加密者的加密安全性没有本地root访问权限          一旦它在引导序列中重新加载,并且完全适用于网络加密会话密钥。          由于来自/dev/random的读取可能会阻止,因此用户通常希望以非阻塞模式打开它(或执行          如果所需的熵不能立即可用,则提供某种用户通知。

<强>建议

作为一般规则,/dev/urandom应该用于除长期GPG / SSL / SSH密钥之外的所有内容。

答案 3 :(得分:2)

简短回答

使用/dev/urandom

长答案

它们都由相同的加密安全伪随机数发生器(CSPRNG)馈电。 /dev/random等待熵(或者更具体地,等待系统对其熵的估计达到适当的水平)的事实只会在您使用信息理论上安全的算法时产生差异,而不是计算上的安全算法。前者包含您可能没有使用的算法,例如Shamir的秘密共享和一次性垫。后者包含您实际使用和关注的算法,例如AES,RSA,Diffie-Hellman,OpenSSL,GnuTLS等。

因此,如果你使用来自/dev/random的数字并不重要,因为它们无论如何都会从CSPRNG中抽出来,而且理论上可能会破坏你可能使用它们的算法反正。

最后,“理论上可能”的位意味着这一点。在这种情况下,这意味着使用世界上所有的计算能力,以及宇宙破解应用程序所存在的时间。

因此,使用/dev/random

几乎没有意义

因此请使用/dev/urandom

来源

1 2 3