导言
在解另外一个issue(gssproxy.service start operation timed out. Terminating.)时了解到熵的概念,在此做下总结。
linux熵池
Linux内核采用熵来描述数据的随机性。熵(entropy)是描述系统混乱无序程度的物理量,一个系统的熵越大则说明该系统的有序性越差,即不确定性越大。在信息学中,熵被用来表征一个符号或系统的不确定性,熵越大,表明系统所含有用信息量越少,不确定度越大。
计算机本身是可预测的系统,因此,用计算机算法不可能产生真正的随机数。但是机器的环境中充满了各种各样的噪声,如硬件设备发生中断的时间,用户点击鼠标的时间间隔等是完全随机的,事先无法预测。Linux内核实现的随机数产生器正是利用系统中的这些随机噪声来产生高质量随机数序列。
Linux 内核维护了一个熵池用来收集来自设备驱动程序和其它来源的环境噪音。理论上,熵池中的数据是完全随机的,可以实现产生真随机数序列。为跟踪熵池中数据的随机性,内核在将数据加入池的时候将估算数据的随机性,这个过程称作熵估算。熵估算值描述池中包含的随机数位数,其值越大表示池中数据的随机性越好。
需要注意的是,产生真随机数依赖于熵池中的噪声资源。如果熵池资源耗尽,就需要等到收集足够多的环境噪声时,才能继续产生新的随机数。
/dev/random 和 /dev/urandom
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/
文件夹中的文件得到。
/proc 接口
entropy_avail
- 内核参数 kernel.random.entropy_avail
- 功能 This read-only file gives the available entropy, in bits. This will be a number in the range 0 to 4096
- 查看系统熵池中拥有的熵数:
cat /proc/sys/kernel/random/entropy_avail
poolsize
- 内核参数 kernel.random.poolsize
- 功能 This file is read-only, and gives the size of the entropy pool in bits. It contains the value 4096
- 查看熵池容量:
cat /proc/sys/kernel/random/poolsize
read_wakeup_threshold
- 内核参数 kernel.random.read_wakeup_threshold
- 功能 This file contains the number of bits of entropy required for waking up processes that sleep waiting for entropy from /dev/random. The default is 64
- 查看从熵池中读取熵的阀值,当 entropy_avail 中的值少于这个阀值,这读取 /dev/random 会被阻塞:
cat /proc/sys/kernel/random/read_wakeup_threshold
write_wakeup_threshold
- 内核参数 kernel.random.write_wakeup_threshold
- 功能 This file contains the number of bits of entropy below which we wake up processes that do a select(2) or poll(2) for write access to /dev/random. These values can be changed by writing to the files
uuid/boot_id
- 内核参数 kernel.random.uuid/kernel.random.boot_id
- 功能
These read-only files contain random strings like
6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9
. The former is generated afresh for each read, the latter was generated once
扩展熵池
rng-tools
安装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)