/dev/[u]random:对熵的解释 | 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 密钥,那么可能已经看到过像下面这样的内容:
We
need to generate a lot of random bytes
.
It
is
a good idea to perform
some other action
(
type on the keyboard
,
move the mouse
,
utilize the
disks
)
during the prime generation
;
this
gives the random number
generator a better chance to gain enough entropy
.
++++++++++..+++++.+++++++++++++++.++++++++++...+++++++++++++++...++++++
+++++++++++++++++++++++++++++.+++++..+++++.+++++.+++++++++++++++++++++++++>.
++++++++++>+++++...........................................................+++++
Not
enough random bytes available
.
Please
do
some other work to give
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,那么当系统的熵耗尽时,你的程序就会变得有趣。无论它直接失败,或只是挂起——直到它获得足够的熵,这取决于你编写的程序。
检查熵
那么,你有多少熵?
[
root@testbox
test
]#
cat
/
proc
/
sys
/
kernel
/
random
/
poolsize
4096
[
root@testbox
test
]#
cat
/
proc
/
sys
/
kernel
/
random
/
entropy_avail
2975
/proc/sys/kernel/random/poolsize,说明熵池的大小(以位为单位)。例如:在停止抽水之前我们应该储存多少随机果汁。/proc/sys/kernel/random/entropy_avail 是当前池中随机果汁的数量(以位为单位)。
我们如何影响这个数字?
这个数字可以像我们使用它一样耗尽。我可以想出的最简单的例子是将 /dev/random 定向到 /dev/null 中:
[
root@testbox
test
]#
cat
/
dev
/
random
>
/dev/
null
&
[
1
]
19058
[
root@testbox
test
]#
cat
/
proc
/
sys
/
kernel
/
random
/
entropy_avail
0
[
root@testbox
test
]#
cat
/
proc
/
sys
/
kernel
/
random
/
entropy_avail
1
影响这个最简单的方法是运行
Haveged
[2]
。Haveged 是一个守护进程,它使用处理器的“抖动”将熵添加到系统熵池中。安装和基本设置非常简单。[
root@b08s02ur
~]#
systemctl
enable haveged
Created
symlink
from
/
etc
/
systemd
/
system
/
multi
-
user
.
target
.
wants
/
haveged
.
service to
/
usr
/
lib
/
systemd
/
system
/
haveged
.
service
.
[
root@b08s02ur
~]#
systemctl
start haveged
在流量相对中等的机器上:
[
root@testbox
~]#
pv
/
dev
/
random
>
/dev/
null
40
B
0
:
00
:
15
[
0
B
/
s
]
[
<=>
]
52
B
0
:
00
:
23
[
0
B
/
s
]
[
<=>
]
58
B
0
:
00
:
25
[
5.92
B
/
s
]
[
<=>
]
64
B
0
:
00
:
30
[
6.03
B
/
s
]
[
<=>
]
^
C
[
root@testbox
~]#
systemctl
start haveged
[
root@testbox
~]#
pv
/
dev
/
random
>
/dev/
null
7.12MiB
0
:
00
:
05
[
1.43MiB
/
s
]
[
<=>
]
15.7MiB
0
:
00
:
11
[
1.44MiB
/
s
]
[
<=>
]
27.2MiB
0
:
00
:
19
[
1.46MiB
/
s
]
[
<=>
]
43MiB
0
:
00
:
30
[
1.47MiB
/
s
]
[
<=>
]
^
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中国
荣誉推出- 物理学上还有哪些反常的实验现象没有得到科学系统的解释呢?
- 南京万达茂坠亡老总家属:我不信会自杀?我需要个解释!
- 怪物猎人世界常用战斗术语 技巧专有名词解释
- 网传“空腹吃荔枝死亡”是真是假?专家解释原由,平时完全不注意
- 老人被医院“误诊”,两月后因病去世,医生的解释,家人感动落泪
- 为啥缅甸美女都想嫁给中国男人,听完当地人解释后,网友表示:不
- 很多时候,宁愿被误会,也不想去解释 信与不信,就在你一念之间
- 太阳附近又出怪事,疑似II级文明在汲取太阳能量,NASA拒绝解释
- 伊朗为何一定要帮巴勒斯坦对付以色列?最高领袖用这一句话解释!
- 男子三根大血管堵了2根,半夜心梗离世,医生解释:两件事害的!