RANDOM - Linux手册页

时间:2019-08-20 18:02:01  来源:igfitidea点击:

Linux程序员手册 第7部分
更新日期: 2017-03-13

名称

random-用于获得随机性的接口概述

说明

内核随机数生成器依靠从设备驱动程序和其他环境噪声源收集的熵来播种密码安全的伪随机数生成器(CSPRNG)。它是为安全而不是速度而设计的。

以下接口提供对内核CSPRNG输出的访问:

*
/ dev / urandom和/ dev / random设备,均在random(4)中进行了描述。这些设备早在Linux上就已经存在,并且在许多其他系统上也可用。
*
特定于Linux的getrandom(2)系统调用,自Linux 3.17起可用。此系统调用提供对与/ dev / urandom相同的源(在此页面中称为urandom源)或与/ dev / random相同的源(在此页面中称为随机源)的访问。默认值为urandom源。通过为系统调用指定GRND_RANDOM标志来选择随机源。 (getentropy(3)函数在getrandom(2)的顶部提供了一个更加可移植的界面。)

Initialization of the entropy pool

内核从环境中收集信息熵。当已经收集到足够数量的随机比特时,将熵池视为已初始化。

Choice of random source

除非您要进行长期密钥生成(而且很可能甚至没有这样做),否则您不应该从/ dev / random设备读取数据,也不应使用带有GRND_RANDOM标志的getrandom(2)。而是从/ dev / urandom设备读取或使用不带GRND_RANDOM标志的getrandom(2)。用于urandom源的密码算法非常保守,因此对于所有目的都应足够。

GRND_RANDOM和从/ dev / random中读取的缺点是,该操作可能会无限期地阻塞。此外,处理使用GRND_RANDOM或从/ dev / random读取时可能发生的部分满足的请求会增加代码的复杂性。

Monte Carlo and other probabilistic sampling applications

使用这些接口为进行蒙特卡洛模拟或其他进行概率采样的程序/算法提供大量数据将很慢。此外,这是不必要的,因为此类应用程序不需要密码安全的随机数。而是使用此页面中描述的接口来获取少量数据,以播种用户空间伪随机数生成器,以供此类应用程序使用。

Comparison between getrandom, /dev/urandom, and /dev/random

下表总结了可用于获得随机性的各种接口的行为。 GRND_NONBLOCK是可用于控制getrandom(2)的阻止行为的标志。该表的最后一列考虑了在尚未初始化熵池的情况下,可能在早期引导时间内发生的情况。

InterfacePoolBlockingbehaviorBehavior when pool is not yet ready
/dev/randomBlocking poolIf entropy too low, blocks until there is enough entropy againBlocks until enough entropy gathered
/dev/urandomCSPRNG outputNever blocksReturns output from uninitialized CSPRNG (may be low entropy and unsuitable for cryptography)
getrandom()Same as/dev/urandomDoes not block once is pool readyBlocks until pool ready
getrandom()GRND_RANDOMSame as/dev/randomIf entropy too low, blocks until there is enough entropy againBlocks until pool ready
getrandom()GRND_NONBLOCKSame as/dev/urandomDoes not block once is pool readyEAGAIN
getrandom()GRND_RANDOM+GRND_NONBLOCKSame as/dev/randomEAGAINif not enough entropy availableEAGAIN

Generating cryptographic keys

生成加密密钥所需的种子材料数量等于密钥的有效密钥大小。例如,一个3072位的RSA或Diffie-Hellman私钥的有效密钥大小为128位(需要大约2 ^ 128次操作才能中断),因此密钥生成器仅需要来自/的128位(16字节)种子材料。开发/随机。

尽管有一定的安全裕度超出该最小值是合理的,但是为了防止CSPRNG算法中的缺陷,当今没有可用的加密原语可以希望保证提供256位以上的安全性,因此,如果有任何程序从其中读取超过256位(32字节)每次调用或每个合理的重新设定种子间隔(不少于一分钟)的内核随机池,都应被视为未熟练实施其加密的标志。

另外参见

getrandom(2),getauxval(3),getentropy(3),random(4),urandom(4),signal(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/