/dev/[u]random:对熵的解释 | Linux 中国

2018 年 5 月 31 日 Linux中国
当谈到 /dev/random 和 /dev/urandom 的主题时,你总是会听到这个词:“熵(Entropy)”。
-- James J



致谢
编译自 | http://jhurani.com/linux/2017/11/01/entropy-explained.html 
 作者 | James J
 译者 | geekpi 💎 💎 共计翻译:727 篇 贡献时间:1679 天

当谈到 /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 漏洞[1]。这个特定的问题是由于某人删除了一些负责添加熵的代码引起的。有传言说,他们因为它导致 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[2]。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/秒。


via: http://jhurani.com/linux/2017/11/01/entropy-explained.html

作者:James J[4] 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出


登录查看更多
0

相关内容

Linux 是一系列类 Unix 计算机操作系统的统称。该操作系统的核心为 Linux 内核。Linux 操作系统也是软件和开放源代码发展中最著名的例子之一。
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
德勤:2020技术趋势报告,120页pdf
专知会员服务
190+阅读 · 2020年3月31日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
213+阅读 · 2020年2月21日
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
AI 和机器学习中暗含的算法偏见 | Linux 中国
Linux中国
3+阅读 · 2018年4月14日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
AI都干过什么让人细思极恐的事?
全球创新论坛
4+阅读 · 2017年9月15日
Arxiv
10+阅读 · 2019年2月19日
Arxiv
6+阅读 · 2018年11月29日
Arxiv
3+阅读 · 2018年5月21日
Arxiv
7+阅读 · 2018年1月31日
Arxiv
5+阅读 · 2017年11月13日
VIP会员
相关VIP内容
一份简明有趣的Python学习教程,42页pdf
专知会员服务
76+阅读 · 2020年6月22日
【干货书】现代数据平台架构,636页pdf
专知会员服务
253+阅读 · 2020年6月15日
德勤:2020技术趋势报告,120页pdf
专知会员服务
190+阅读 · 2020年3月31日
算法与数据结构Python,369页pdf
专知会员服务
162+阅读 · 2020年3月4日
【2020新书】数据科学:十大Python项目,247页pdf
专知会员服务
213+阅读 · 2020年2月21日
相关资讯
一个牛逼的 Python 调试工具
机器学习算法与Python学习
15+阅读 · 2019年4月30日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
Python3.8新特性概览
Python程序员
4+阅读 · 2018年12月8日
Python3.7中一种懒加载的方式
Python程序员
3+阅读 · 2018年4月27日
AI 和机器学习中暗含的算法偏见 | Linux 中国
Linux中国
3+阅读 · 2018年4月14日
为什么你应该学 Python ?
计算机与网络安全
4+阅读 · 2018年3月24日
教你用Python来玩跳一跳
七月在线实验室
6+阅读 · 2018年1月2日
10个深度学习软件的安装指南(附代码)
数据派THU
17+阅读 · 2017年11月18日
AI都干过什么让人细思极恐的事?
全球创新论坛
4+阅读 · 2017年9月15日
Top
微信扫码咨询专知VIP会员