/dev/urandom和/dev/random的区别是什么
linux中提供了 /dev/urandom
和 /dev/random
两个特殊设备来提供随机数。那么这两个文件有什么区别呢?
要回答这个问题,先需要了解熵这个概念。
熵
linux是根据系统的熵池来产生随机数的。熵池就是系统当前的环境噪音,环境噪音的来源很多,键盘的输入、鼠标的移动、内存的使用、文件的使用量、进程数量等等。
当系统的熵不够大的时候,则系统产生的随机数随机效果就不是很好,也就是说更容易被人猜测出来。
如何查看系统中的熵
通过下面命令可以查看系统熵池的容量:
cat /proc/sys/kernel/random/poolsize
结果为:
4096
通过下面命令可以查看系统熵池中拥有的熵数:
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
resolving dependencies... looking for conflicting packages... [0;1mPackages (1)[0m haveged-1.9.1-4 [0;1mTotal Download Size: [0m 0.04 MiB [0;1mTotal Installed Size:[0m 0.14 MiB [1;34m::[0;1m Proceed with installation? [Y/n] [0m [1;34m::[0;1m Retrieving packages... [0m haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 0.0 B 0.00B/s 00:00 [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% haveged-1.9.1-4-x86_64 41.2 KiB 412K/s 00:00 [----------------------] 100% (0/1) checking keys in keyring [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking keys in keyring [----------------------] 100% (0/1) checking package integrity [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking package integrity [----------------------] 100% (0/1) loading package files [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) loading package files [----------------------] 100% (0/1) checking for file conflicts [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking for file conflicts [----------------------] 100% (0/1) checking available disk space [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) checking available disk space [----------------------] 100% [1;34m::[0;1m Processing package changes... [0m(1/1) installing haveged [[1;33mc[m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m[0;37mo[m[0;37m [m[0;37m [m] 0% (1/1) installing haveged [----------------------] 100% [1;34m::[0;1m Running post-transaction hooks... [0m(1/1) Arming ConditionNeedsUpdate...
然后开启 haveged
服务
systemctl enable haveged systemctl start haveged
/dev/random 与 /dev/urandom 的区别
/dev/random
是真随机数生成器,它会消耗熵值来产生随机数,同时在熵耗尽的情况下会阻塞,直到有新的熵生成.
注:网上有关于random具有更好的随机性的说法,这一点存在疑问,请阅读How To Safely Generate A Random Number 和 Myths about /dev/urandom 这两篇文章。
而 /dev/urandom
是伪随机数生成器,它根据一个初始的随机种子(这个种子来源就是熵池中的熵)来产生一系列的伪随机数,而并不会在熵耗尽的情况下阻塞。
但是 若在系统启动阶段使用 /dev/urandom
则可能存在熵池中还不存在任何熵的情况,这时用 /dev/urandom
产生的随机数是可预测的!
结合这者的特点,可以看出,除非要在启动启动阶段产生随机数,否则绝大多数情况下还是使用 /dev/urandom
来产生随机数,这样才不会引起程序莫名的挂起。