我试图找出/dev/random
和/dev/urandom
个文件之间的差异
/dev/random
和/dev/urandom
之间有什么区别? 答案 0 :(得分:38)
使用/dev/random
可能需要等待结果,因为它使用所谓的熵池,此时可能无法获得随机数据。
/dev/urandom
返回用户请求的字节数,因此它的随机性低于/dev/random
。
从手册页中可以看到:
<强>随机强>
读取时,
/dev/random
设备只返回其中的随机字节 熵池中估计的噪声比特数。/dev/random
应适用于需要非常高质量随机性的用途 例如一次性垫或密钥生成。当熵池是 空,从/dev/random
读取将阻止直到另外 收集环境噪音。
<强> urandom的强>
来自
/dev/urandom
设备的读取不会阻止等待更多 熵。结果,如果没有足够的熵 熵池,返回值理论上容易受到影响 对驱动程序使用的算法进行加密攻击。知识 如何执行此操作在当前未分类中不可用 文献,但理论上可能是这样的攻击 存在。如果这是您的应用程序中的问题,请使用/dev/random
代替。
出于加密目的,您应该使用/dev/random
,因为它返回的数据的性质。为了安全起见,可能的等待应被视为可接受的权衡,IMO。
当您需要随机数据快速时,您当然应该使用/dev/urandom
。
答案 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
是内核随机数生成器的接口:
当涉及到差异时,它取决于操作系统:
/dev/random
读取可能会阻止,这实际上限制了它在实践中的使用/dev/urandom
只是/dev/random
的符号链接。我什么时候应该使用它们? 我什么时候不应该使用它们?
很难找到一个用/dev/random
超过/dev/urandom
的用例。
阻止的危险:
/dev/random
时,这是一个您必须面对的真正问题。对于像ssh-keygen
这样的单一用法,可以等待几秒钟,但对于大多数其他情况,它将不是一个选项。/dev/random
,则应以非阻止模式打开它,如果无法立即获得所需的熵,则会提供某种用户通知。安全强>
/dev/urandom
中,对于几乎所有实际情况(例如Is a rand from /dev/urandom secure for a login key?和Myths about /dev/urandom)都被认为是安全的。
/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