当前位置:嗨网首页>书籍在线阅读

22-随机数生成器

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

8.5.2 随机数生成器

内核的随机数生成器位于/dev/random和/dev/urandom设备中。它们的主设备号是1,次设备号分别是8和9。

内核的随机数生成器从设备驱动和其他源中收集噪声,内核把收集的噪声进行连结并做单向散列操作,把结果存储在内核熵池(entropy pool)中。内核保留池中的估计值数的熵。

读取/dev/random时,会返回该池中的熵。该结果适于作为随机数生成器的种子,用来生成密钥或其他需要强熵加密的任务。

理论上,攻击者能从熵池中获取足够数据并成功破解单向散列,并能获得足够多的熵池中剩余熵的状态信息。尽管目前这样的攻击只是理论上存在(众所周知,这种攻击尚未发生过),但内核仍能通过对每个请求,减少池中熵数的估计值来应对这种可能的攻击。当熵数的估计值变成0时,读取请求将阻塞,直到系统产生更多的熵,且对熵的估计值足以能满足读取的请求。

/dev/urandom不具有该特性,即使内核熵预算数量不足以完成请求,对该设备的读取请求仍会成功。仅仅是那些对安全性要求极高的程序(例如GNU Privacy Guard中安全数据交换的密钥生成器)需要关注加密的强类型的熵。大多数应用程序应使用/dev/urandom而非/dev/random。在没有填充内核熵池的I/O行为发生时,读取/dev/random会阻塞一段很长的时间。这种情况在服务器没有磁盘空间且没有监控时是比较常见的。