/dev/random
我已经阅读了很多关于和之间的区别/dev/urandom
。我了解普遍的建议是使用/dev/urandom
. 解释——256 位的“适当”随机性是几乎所有加密应用程序所需的全部——对我来说很有意义。
一些有用的资源:
- https://pthree.org/2014/07/21/the-linux-random-number-generator/
- http://www.2uo.de/myths-about-urandom/
首次启动后的虚拟机 (VM) 或 Live CD 的状态有时被识别为本指南的异常边缘情况,因为/dev/urandom
可能没有正确播种。
在所有其他可能用途的上下文中/dev/urandom
,我可以看到这是一个极端情况。但是,鉴于您是第一次使用 VM,您可能想要做的第一件事似乎是调用 on /dev/urandom
,例如生成 SSH 密钥。
所以,如果你假设你的虚拟机是最坏的(例如它被克隆了,或者重启后新播种的随机数不好),你能做些什么来确保它/dev/urandom
是好的?
最懒惰的做法似乎是让虚拟机运行一会儿,直到随机事件重新植入输入池。尴尬的部分是空闲的虚拟机执行此操作非常缓慢。
我想测试发生这种情况需要多长时间,我尝试这样做:
此命令从池中提取 32 字节/256 位(并以十六进制显示)
head -c 32 </dev/random | xxd -p
一旦输入池的熵计数达到最低水平(用 可见cat /proc/sys/kernel/random/entropy_avail
),上面的命令将阻塞,直到新的随机事件进入输入池。这向我表明,如果我们重复运行上述命令,对其计时,并将结果写入一个名为randomtest
它的文件,这将指示重新填充输入池需要多长时间。
我尝试编写一个这样做的单行命令:
for n in {1..10}; do (/usr/bin/time -f "%E Real" sh -c 'printf "%-10s" $(head -c 32 </dev/random | xxd -p)' 2>&1) >> randomtest; done
更具可读性:
for n in {1..10};
do (/usr/bin/time -f "%E Real" sh -c \
'printf "%-10s" $(head -c 32 </dev/random | xxd -p)' 2>&1) \
>> randomtest;
done
我知道启动进程(甚至是上面的 cat 命令)会占用输入池,所以这将提供一个保守的估计。值得一提的是,我让上述命令在不活动的 VM 上运行,新的 32 字节序列之间的时间稳定在 15-20 分钟。
我的问题:
- 该命令的输出是否成功测试了我认为它的作用?
- 有没有更简单的方法来测试同样的东西?
/dev/urandom
与让虚拟机闲置相比,是否有一种不同/更好的“懒惰”方式来刷新输入池和重新播种?