linux中提供了 /dev/urandom 和 /dev/random 两个特殊设备来提供随机数。那么这两个文件有什么区别呢?linux
要回答这个问题,先须要了解熵这个概念。
熵dom
linux是根据系统的熵池来产生随机数的。熵池就是系统当前的环境噪音,环境噪音的来源不少,键盘的输入、鼠标的移动、内存的使用、文件的使用量、进程数量等等。ide
当系统的熵不够大的时候,则系统产生的随机数随机效果就不是很好,也就是说更容易被人猜想出来。加密
经过下面命令能够查看系统熵池的容量:进程
cat /proc/sys/kernel/random/poolsize内存
结果为:it
4096class
经过下面命令能够查看系统熵池中拥有的熵数:随机数
cat /proc/sys/kernel/random/entropy_avail 程序
结果为:
3793
经过下面命令能够查看从熵池中读取熵的阀值,当 entropy_avail 中的值少于这个阀值,这读取 /dev/random 会被阻塞:
cat /proc/sys/kernel/random/read_wakeup_threshold
结果为:
64
经过开启 haveged 服务能够快速产生熵。若 entropy_avail 的值小于1000,则建议安装 haveged,不然加密程序会阻塞直到系统有足够的熵后才继续运行。
pacman -S haveged --noconfirm
而后开启 haveged 服务
systemctl enable haveged
systemctl start haveged
/dev/random 是真随机数生成器,它会消耗熵值来产生随机数,同时在熵耗尽的状况下会阻塞,直到有新的熵生成.
注:网上有关于random具备更好的随机性的说法,这一点存在疑问,请阅读How To Safely Generate A Random Number 和 Myths about /dev/urandom 这两篇文章。
而 /dev/urandom 是伪随机数生成器,它根据一个初始的随机种子(这个种子来源就是熵池中的熵)来产生一系列的伪随机数,而并不会在熵耗尽的状况下阻塞。
可是 若在系统启动阶段使用 =/dev/urandom= 则可能存在熵池中还不存在任何熵的状况,这时用 =/dev/urandom= 产生的随机数是可预测的!
结合这者的特色,能够看出,除非要在启动启动阶段产生随机数,不然绝大多数状况下仍是使用 /dev/urandom 来产生随机数,这样才不会引发程序莫名的挂起。