Answers:
您的系统通过关注不同事件来收集一些“真实”随机数:网络活动,硬件随机数生成器(如果可用;例如VIA处理器通常具有“真实”随机数生成器)等等。如果将这些内容馈送到内核熵池中,则由/ dev / random使用。需要某种极端安全性的应用程序倾向于使用/ dev / random作为其熵源,或者换句话说,就是随机性源。
如果/ dev / random耗尽了可用的熵,它将无法提供更多的随机性,并且等待随机性的应用程序将停滞不前,直到有更多的随机数据可用为止。我在职业生涯中看到的示例是Cyrus IMAP守护程序希望使用/ dev / random来实现随机性,而其POP会话希望从/ dev / random中生成APOP连接中的随机字符串。在繁忙的环境中,登录尝试次数多于用于馈送/ dev / random的流量->一切都停滞了。在那种情况下,我安装了rng-tools并激活了它的rngd -将半随机数从/ dev / urandom铲除到/ dev / random,以防/ dev / random超出“真实”熵的范围。
如果要更简单地了解基本问题:某些应用程序(例如加密)需要随机数。您可以使用算法生成随机数-但是,尽管它们在某种意义上是随机的,但在另一种意义上却是完全可以预测的。例如,如果我为您提供数字58209749445923023078164062862089986280348253253421170679,它们看起来非常随机。但是,如果您意识到它们实际上是PI的数字,那么您将知道下一个将是8。
对于某些应用程序,这是可以的,但是对于其他应用程序(尤其是与安全性相关的应用程序),人们希望拥有真正不可预测的随机性-不能由算法(即程序)生成,因为根据定义,这是可预测的。这是一个问题,因为您的计算机本质上是一个程序,那么它怎么可能获得真正的随机数?答案是通过测量来自外部世界的真实随机事件-例如按键之间的间隙,并使用这些间隙将真实随机性注入本来可以预测的随机数生成器中。“熵池”可以被认为是这种随机性的存储,它是由击键(或正在使用的任何东西)建立的,并由随机数的产生消耗掉的。
熵是“随机性”的技术术语。计算机实际上并不会产生熵,而是通过查看诸如硬盘转速变化之类的东西(由于摩擦等原因很难预测的物理现象)来收集信息。当计算机想要产生伪随机数据时,它将可以通过测量鼠标点击,硬盘驱动器旋转变化等来播种具有真正熵的数学公式。大致来说,这entropy_avail
是当前可从中读取的位的度量/dev/random
除非计算机具有诸如噪声二极管之类的凉爽硬件,否则从计算机读取环境中的熵将花费一些时间。
如果你有熵可用的4096位,你的猫/dev/random
,你可以期望能够在文件块前阅读512个字节熵(4096位),同时等待更多的熵。
例如,如果您“ cat /dev/random
”,您的熵将缩小为零。最初,您将获得512字节的随机垃圾,但是它将停止,并且您会逐渐看到更多的随机数据滴流槽。
但是,这不是人们应该如何操作的方式/dev/random
。通常,开发人员将读取少量数据(如128位),并使用它来播种某种PRNG算法。礼貌的是,不要阅读/dev/random
比您需要的更多的熵,因为建立起来需要很长时间,因此被认为是有价值的。因此,如果您cat
像上面那样不小心地处理文件而耗尽了文件,则会导致其他需要读取的应用程序/dev/random
阻塞。在一个正在运行的系统上,我们注意到许多加密功能正在停滞。我们发现一个cron作业正在调用一个python脚本,该脚本一直在初始化ramdom.random()
每几秒钟运行一次。为了解决这个问题,我们重写了python脚本,使其作为仅初始化一次的守护进程运行,并且cron作业将通过XMLRPC读取数据,因此它将不会/dev/random
在启动时继续读取数据。
只读文件entropy_avail给出可用的熵。通常,这将是4096(位),即完整的熵池。
您可以在以下位置阅读更多信息:http : //linux.die.net/man/4/random