双方/dev/random
并/dev/urandom
使用“熵池”。当池用完时,/dev/random
等待其重新填充,这需要监视系统行为(键盘输入,鼠标移动等),而池/dev/urandom
将继续为您提供伪随机数据。 /dev/random
理论上质量较高,但/dev/urandom
几乎可以肯定足以满足您的目的。(但是,甚至/dev/urandom
可能比其他方法要慢。更快但质量较低的生成器可能足以擦除硬盘驱动器。目前尚不清楚,攻击者通过知道将要生成的序列会获得任何好处,或者为此目的,随机数要比0、1、2、3、4等序列更好。)
引用random(4)
手册页:
如果不确定是否应使用/dev/random
或
/dev/urandom
,则可能要使用后者。作为一般规则,/dev/urandom
应使用除长期使用的GPG / SSL / SSH密钥以外的所有密钥。
更新:自从我写那以来,`random(4)手册页已经更新。现在它说:
该/dev/random
接口被认为是旧式接口,并且/dev/urandom
在所有用例中都是首选且足够的接口,
但在早期启动时需要随机性的应用程序除外;对于这些应用程序,getrandom(2)
必须改为使用它,因为它会阻塞直到初始化熵池。
另请参见ThomasHühn的“ 关于/ dev / urandom的神话 ”。
但是/dev/urandom
,即使它不会阻塞,但如果要生成大量数据,它可能也会太慢。在尝试对系统进行一些测量之前。
编辑:以下是“真”随机数与伪随机数的题外话。如果您仅对该问题有实际答案,可以立即停止阅读。
我似乎声称(包括此处的其他答案)/dev/random
实现了“真实”随机数生成器,而不是伪随机数生成器(PRNG)。例如,维基百科的文章提出了这样的主张。我认为那是不对的。有它的一些讨论,在这里是指硬件随机数生成器,但我看不出有什么证据表明,/dev/random
通常使用这样的设备,或者是典型的电脑甚至有这样的设备。它们不同于C rand()
函数之类的PRNG ,因为它们是不确定的,因为它们从实际上不可预测的源中获取熵。
我想说三类“随机”数字生成器:
确定性PRNG(如C rand()
函数)使用一种算法来生成具有(或多或少)真正随机序列的统计特性的可重复序列。这些对于游戏来说已经足够好了(提供了很好的播种方式),并且对于需要可重复性的应用程序是必需的,但是它们不适合密码学。
发电机像/dev/random
和/dev/urandom
从一些几乎不可预测的源,其收获熵等I / O活动(这就是为什么在键盘上捣或移动鼠标可以引起/dev/random
产生更多的数据)。(对我而言)尚不清楚它们是否满足PRNG的定义(我见过说PRNG是确定性的定义),但它们也不是真正的随机数生成器。
硬件随机数生成器,即使在完全了解其初始状态的情况下,在物理上也是不可预测的,并且还使用数学技术来确保正确的统计属性。