导言
在解另外一个issue(gssproxy.service start operation timed out. Terminating.)时了解到熵的概念,在此做下总结。
Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。
计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。
Linux 内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
需要注意的是,产生真随机数依赖于熵池中的噪声资源。如果熵池资源耗尽,就需要等到收集足够多的环境噪声时,才能继续产生新的随机数。
Linux 提供了内核随机数生成器的接口,即字符设备/dev/random
。在读取时,/dev/random
设备会返回小于熵池噪声总数的随机字节。
/dev/random
可生成高随机性的公钥或一次性密码本。若熵池空了,对/dev/random
的读操作将会被阻塞,直到收集到了足够的环境噪声为止。这样的设计使得/dev/random
是真正的随机数发生器,提供了最大可能的随机数据熵,建议在需要生成高强度的密钥时使用。
/dev/random
的一个副本是/dev/urandom
(“unblocked”,非阻塞的随机数发生器),它会重复使用熵池中的数据以产生伪随机数据。这表示对/dev/urandom
的读取操作不会产生阻塞(但在请求大量数据时,可能会导致明显的延迟。),但其输出的熵可能小于/dev/random
的。它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
/dev/random
也允许写入,任何用户都可以向熵池中加入随机数据。即使写入非随机数据亦是无害的,因为只有管理员可以调用ioctl以增加熵池大小。Linux内核中当前熵的值和大小可以通过访问/proc/sys/kernel/random/
文件夹中的文件得到。
cat /proc/sys/kernel/random/entropy_avail
cat /proc/sys/kernel/random/poolsize
cat /proc/sys/kernel/random/read_wakeup_threshold
6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9
. The former is generated afresh for each read, the latter was generated once安装rng-tools
,并设置开机自启:
[root@localhost ~]# yum install rng-tools
[root@localhost ~]# systemctl enable rng-tools
使用命令cat /proc/cpuinfo | grep rdrand
可以查看自己的CPU是否带有DRNG(Digital Random Number Generator )特性,可以充分利用硬件来提高熵池产生的速度。
如果你的硬件不支持,可以使用/dev/urandom
来做“熵源”。编辑配置文件以下内容/usr/lib/systemd/system/rngd.service
:
[service]
ExecStart=/sbin/rngd -f -r /dev/urandom
man 4 random /dev/random(https://zh.wikipedia.org/wiki//dev/random)
本文分享自 WriteSimpleDemo 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!