/dev/[u]random:对熵的解释

简介:

当谈到 /dev/random/dev/urandom 的主题时,你总是会听到这个词:“熵Entropy”。每个人对此似乎都有自己的比喻。那为我呢?我喜欢将熵视为“随机果汁”。它是果汁,随机数需要它变得更随机。

如果你曾经生成过 SSL 证书或 GPG 密钥,那么可能已经看到过像下面这样的内容:

 
  1. We need to generate a lot of random bytes. It is a good idea to perform
  2. some other action (type on the keyboard, move the mouse, utilize the
  3. disks) during the prime generation; this gives the random number
  4. generator a better chance to gain enough entropy.
  5. ++++++++++..+++++.+++++++++++++++.++++++++++...+++++++++++++++...++++++
  6. +++++++++++++++++++++++++++++.+++++..+++++.+++++.+++++++++++++++++++++++++>.
  7. ++++++++++>+++++...........................................................+++++
  8. Not enough random bytes available. Please do some other work to give
  9. the OS a chance to collect more entropy! (Need 290 more bytes)

通过在键盘上打字并移动鼠标,你可以帮助生成熵或随机果汁。

你可能会问自己……为什么我需要熵?以及为什么它对于随机数真的变得随机如此重要?那么,假设我们的熵的来源仅限于键盘、鼠标和磁盘 IO 的数据。但是我们的系统是一个服务器,所以我知道没有鼠标和键盘输入。这意味着唯一的因素是你的 IO。如果它是一个单独的、几乎不使用的磁盘,你将拥有较低的熵。这意味着你的系统随机的能力很弱。换句话说,我可以玩概率游戏,并大幅减少破解 ssh 密钥或者解密你认为是加密会话的时间。

好的,但这是很难实现的对吧?不,实际上并非如此。看看这个 Debian OpenSSH 漏洞。这个特定的问题是由于某人删除了一些负责添加熵的代码引起的。有传言说,他们因为它导致 valgrind 发出警告而删除了它。然而,在这样做的时候,随机数现在少了很多随机性。事实上,熵少了很多,因此暴力破解变成了一个可行的攻击向量。

希望到现在为止,我们理解了熵对安全性的重要性。无论你是否意识到你正在使用它。

/dev/random 和 /dev/urandom

/dev/urandom 是一个伪随机数生成器,缺乏熵它也不会停止。

/dev/random 是一个真随机数生成器,它会在缺乏熵的时候停止。

大多数情况下,如果我们正在处理实际的事情,并且它不包含你的核心信息,那么 /dev/urandom 是正确的选择。否则,如果就使用 /dev/random,那么当系统的熵耗尽时,你的程序就会变得有趣。无论它直接失败,或只是挂起——直到它获得足够的熵,这取决于你编写的程序。

检查熵

那么,你有多少熵?

 
  1. [root@testbox test]# cat /proc/sys/kernel/random/poolsize
  2. 4096
  3. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
  4. 2975

/proc/sys/kernel/random/poolsize,说明熵池的大小(以位为单位)。例如:在停止抽水之前我们应该储存多少随机果汁。/proc/sys/kernel/random/entropy_avail 是当前池中随机果汁的数量(以位为单位)。

我们如何影响这个数字?

这个数字可以像我们使用它一样耗尽。我可以想出的最简单的例子是将 /dev/random 定向到 /dev/null 中:

 
  1. [root@testbox test]# cat /dev/random > /dev/null &
  2. [1] 19058
  3. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
  4. 0
  5. [root@testbox test]# cat /proc/sys/kernel/random/entropy_avail
  6. 1

影响这个最简单的方法是运行 Haveged。Haveged 是一个守护进程,它使用处理器的“抖动”将熵添加到系统熵池中。安装和基本设置非常简单。

 
  1. [root@b08s02ur ~]# systemctl enable haveged
  2. Created symlink from /etc/systemd/system/multi-user.target.wants/haveged.service to /usr/lib/systemd/system/haveged.service.
  3. [root@b08s02ur ~]# systemctl start haveged

在流量相对中等的机器上:

 
  1. [root@testbox ~]# pv /dev/random > /dev/null
  2. 40 B 0:00:15 [ 0 B/s] [ <=> ]
  3. 52 B 0:00:23 [ 0 B/s] [ <=> ]
  4. 58 B 0:00:25 [5.92 B/s] [ <=> ]
  5. 64 B 0:00:30 [6.03 B/s] [ <=> ]
  6. ^C
  7. [root@testbox ~]# systemctl start haveged
  8. [root@testbox ~]# pv /dev/random > /dev/null
  9. 7.12MiB 0:00:05 [1.43MiB/s] [ <=> ]
  10. 15.7MiB 0:00:11 [1.44MiB/s] [ <=> ]
  11. 27.2MiB 0:00:19 [1.46MiB/s] [ <=> ]
  12. 43MiB 0:00:30 [1.47MiB/s] [ <=> ]
  13. ^C

使用 pv 我们可以看到我们通过管道传递了多少数据。正如你所看到的,在运行 haveged 之前,我们是 2.1 位/秒(B/s)。而在开始运行 haveged 之后,加入处理器的抖动到我们的熵池中,我们得到大约 1.5MiB/秒。


原文发布时间为:2018-05-31
本文作者: James J
本文来自云栖社区合作伙伴“ Linux中国开源社区”,了解相关信息可以关注“ Linux中国开源社区”。
相关文章
|
8天前
|
数据可视化
R语言检验独立性:卡方检验(Chi-square test)
R语言检验独立性:卡方检验(Chi-square test)
149 3
|
10月前
|
机器学习/深度学习 数据挖掘 数据管理
Broom |tidy up a bit,模型,检验结果一键输出!
Broom |tidy up a bit,模型,检验结果一键输出!
Broom |tidy up a bit,模型,检验结果一键输出!
|
11月前
|
机器学习/深度学习
Lesson 5.3 ROC-AUC 的计算方法、基本原理与核心特性
Lesson 5.3 ROC-AUC 的计算方法、基本原理与核心特性
|
11月前
|
PyTorch 算法框架/工具
Pytorch疑难小实验:Torch.max() Torch.min()在不同维度上的解释
Pytorch疑难小实验:Torch.max() Torch.min()在不同维度上的解释
119 0
python SMAP_level2c nc 文件做线性拟合:y=ax+b
最近再处理卫星盐度数据时,通过时空匹配以及质量控制之后,需要对所得数据进行拟合分析。进而分析其误差分布、原因等。 根据学习,python中自带线性拟合的函数,使用起来较为方便快捷~
python SMAP_level2c nc 文件做线性拟合:y=ax+b
|
Python
Python编程:random随机模块
Python编程:random随机模块
147 0
TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—daidingdaiding
TF之AE:AE实现TF自带数据集数字真实值对比AE先encoder后decoder预测数字的精确对比—daidingdaiding
|
存储
Jmeter系列(48)- 详解 Random Variable 随机变量
Jmeter系列(48)- 详解 Random Variable 随机变量
255 0
Jmeter系列(48)- 详解 Random Variable 随机变量
|
机器学习/深度学习 计算机视觉 Python
关于python机器学习cross_val_score()交叉检验的参数cv实际默认为5这件事,你怎么看?
关于python机器学习cross_val_score()交叉检验的参数cv实际默认为5这件事,你怎么看?
515 0
关于python机器学习cross_val_score()交叉检验的参数cv实际默认为5这件事,你怎么看?
|
算法 计算机视觉
泊松分布采样 (Poisson-Disk-Sample)代码及详细注释【OpenCV】
泊松分布采样 (Poisson-Disk-Sample)代码及详细注释【OpenCV】
732 0
泊松分布采样 (Poisson-Disk-Sample)代码及详细注释【OpenCV】