0

/dev/urandom和/dev/random的区别是什么

 2 years ago
source link: https://www.lujun9972.win/blog/2018/02/05/-dev-urandom%E5%92%8C-dev-random%E7%9A%84%E5%8C%BA%E5%88%AB%E6%98%AF%E4%BB%80%E4%B9%88/index.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

/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 NumberMyths about /dev/urandom 这两篇文章。

/dev/urandom 是伪随机数生成器,它根据一个初始的随机种子(这个种子来源就是熵池中的熵)来产生一系列的伪随机数,而并不会在熵耗尽的情况下阻塞。

但是 若在系统启动阶段使用 /dev/urandom 则可能存在熵池中还不存在任何熵的情况,这时用 /dev/urandom 产生的随机数是可预测的!

结合这者的特点,可以看出,除非要在启动启动阶段产生随机数,否则绝大多数情况下还是使用 /dev/urandom 来产生随机数,这样才不会引起程序莫名的挂起。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK