文档章节

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

lieefu
 lieefu
发布于 2015/12/23 10:30
字数 849
阅读 1521
收藏 7
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操作系统在系统关机的时候保存当前熵池的内容,当系统下次启动的时候恢复上次关机时熵池的数据,这样就有效增加了熵池的熵估算值,避免了随机数序列质量的下降。

© 著作权归作者所有

共有 人打赏支持
上一篇: git标签tag
lieefu
粉丝 90
博文 116
码字总数 24677
作品 3
济南
高级程序员
私信 提问
彻底找到 Tomcat 启动速度慢的元凶

问题现象 美女同事找我解决一个问题,说Tomcat启动很慢。开始我以为是程序写的问题,所以把webapps下所有程序都删除掉。(只保留Tomcat自带)灵异的事情发生了,Tomcat停止在—— 我查看了一...

MaxWell__
04/26
0
0
Oracle JDBC 连接卡死后 Connection Reset

症状: 在Linux主机上远程登录,执行一个简单的Oracle的JDBC连接程序(jar包),结果硬生生的卡在了连接建立验证阶段,然后等上几分钟后因为连接超时,连接被远端的Oracle服务器reset,于是报...

122269875
2017/08/24
0
0
/dev/[u]random:对熵的解释

熵 当谈到 和 的主题时,你总是会听到这个词:“熵Entropy”。每个人对此似乎都有自己的比喻。那为我呢?我喜欢将熵视为“随机果汁”。它是果汁,随机数需要它变得更随机。 如果你曾经生成过...

01%
05/31
0
0
如何创建/dev/random和/dev/urandom字符设备

/dev/random和/dev/urandom是内核随机数源设备,用于产生随机数。产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的...

SoulMio
2017/10/30
0
0
Tomcat 启动时 SecureRandom 非常慢解决办法

Tomcat 启动时 SecureRandom 非常慢解决办法 作者:张松然 字体:[增加 减小] 类型:转载 时间:2017-06-25 我要评论 这篇文章主要介绍了Tomcat 启动时 SecureRandom 非常慢解决办法的相关资...

Ltaotao
06/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
17分钟前
0
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
29分钟前
1
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
31分钟前
5
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
32分钟前
1
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
37分钟前
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部