linux系统随机数原理,内核熵(entropy)值

Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不肯定性越大。在信息学中,熵被用来表征一个符号或系统的不肯定性,熵越大,代表系统所含有用信息量越少,不肯定度越大。
计算机自己是可预测的系统,所以,用计算机算法不可能产生真正的随机数。可是机器的环境中充满了各类各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是彻底随机的,事先没法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。

内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是彻底随机的,能够实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称做熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。 算法

内核提供了两个字符设备: /dev/random和/dev/urandom,其read函数(random_read()和urandom_read())用于向用户模式程序输出随机数序列。上层应用程序能够经过read系统调用从它们获取随机数序列。相对于/dev/urandom接口,/dev/random输出的随机数序列质量更高,适合于高强度的加密算法。/dev/urandom老是返回所请求的随机数序列,不管熵池的熵估算值是否为零;而/dev/random则只返回熵估算值所容许的最长的随机数序列,当熵估算值为零时,请求将被阻塞直到熵估算值增大到必定域值。
上述输出接口最终均是经过调用 extract_entropy()函数输出随机数序列。Extract_entropy()函数使用SHA或MD5算法散列(Hash)熵池,将散列后的结果做为随机数序列输出给用户使用,这样避免了直接访问熵池中的内容。因为从SHA或MD5算法散列的结果反推原始数据的可能性几乎为零,因此这种设计极大的提升了安全性。攻击者没法直接访问熵池,也没法根据过去的随机数序列预测未来的序列。
当系统启动的时候,因为启动过程是个肯定的可预测的过程,这种状况下,熵池的熵值将很是小,致使产生的随机数序列质量降低,从而给攻击者破解的可能。为了克服系统启动过程的可预测性带来的影响,Linux操做系统在系统关机的时候保存当前熵池的内容,当系统下次启动的时候恢复上次关机时熵池的数据,这样就有效增长了熵池的熵估算值,避免了随机数序列质量的降低。
安全

相关文章
相关标签/搜索