Linux有两个可用于用户空间的随机数生成器,/dev/random
和/dev/urandom
。
/dev/random
是“真实”随机性的来源-即它不是由伪随机数生成器生成的。熵由输入驱动程序和中断处理程序通过函数add_input_randomness
和馈入add_interrupt_randomness
。如果熵耗尽,读取此设备的进程将阻塞。
/dev/urandom
是一个伪随机数生成器。它由与相同的熵池馈送/dev/random
,但是用尽时,它将切换到加密强度较高的生成器。
用户空间应用程序可以通过写入来馈入熵池/dev/{,u}random
。
阅读random(4)手册页,以及drivers/char/random.c
内核源代码树中的文件。它得到了很好的评论,您的大部分要求都在此处得到了解释。
FreeBSD的/dev/random
默认情况下是使用Yarrow算法的伪随机数生成器(但如果连接了RNG则可以指向硬件RNG)。软件生成器从以太网,串行连接和硬件中断(可通过更改sysctl kern.random
)中获取信息。只要内部状态未知,Yarrow算法就被认为是安全的,因此/dev/random
应始终输出高质量数据而不会阻塞。参见random(4)。
在NetBSD上,仅基于收集到的熵(从磁盘,网络,输入设备和/或磁带驱动器;可使用rndctl进行调整)/dev/random
提供随机数据,而在熵池为空时回退到PRNG,类似于Linux。参见random(4),rndctl(8),rnd(9)。/dev/urandom
OpenBSD有四个生成器:/dev/random
是硬件生成器,/dev/srandom
是安全的随机数据生成器(在熵池上使用MD5:“磁盘和网络设备中断等”),/dev/urandom
类似,但是在熵池为空时回退到PRNG。第四个/dev/arandom
也是PRNG,但使用RC4。参见random(4),arc4random(3)。
Mac OS X也将Yarrow算法用于/dev/random
,但是具有相同/dev/urandom
的兼容性。“另外的熵由SecurityServer守护程序定期根据内核的随机抖动测量馈送到生成器。” 参见random(4)。