/ dev / random非常慢?

时间:2011-01-27 16:57:23

标签: linux terminal

一些背景信息:我希望在Red Hat服务器上运行脚本以从/ dev / random读取一些数据并使用Perl unpack()命令将其转换为十六进制字符串以供以后使用(基准测试数据库)操作)。我在/ dev / random上运行了一些“head -1”,它似乎工作正常,但在调用它几次后,它就会有点挂起。几分钟后,它最终会输出一小段文字,然后完成。

我切换到/ dev / urandom(我真的不想,它的速度慢,我不需要那种随机性)并且它对前两个或三个调用工作正常,然后它也开始挂起。 我想知道它是否是轰炸它的“头部”命令,所以我尝试使用Perl做一些简单的I / O,它也悬挂着。 作为最后的努力,我使用“dd”命令将一些信息直接转储到文件而不是终端。我所要求的只是1mb的数据,但在我杀死它之前花了3分钟才得到~400字节。

我检查了进程列表,CPU和内存基本没有动过。究竟是什么原因可能会导致/ dev / random这样做,以及我可以做些什么来防止/修复它?

编辑:感谢帮帮!似乎我随机和随机混淆了。我现在已经启动并运行了该脚本。看起来我今天学到了新东西。 :)

6 个答案:

答案 0 :(得分:47)

在大多数Linux系统上,/dev/random由环境收集的实际熵提供支持。如果您的系统没有从/dev/random提供大量数据,则可能意味着您没有产生足够的环境随机性来为其供电。

我不确定为什么你认为/dev/urandom“慢”或更高质量。它重用内部熵池来生成伪随机性 - 使其质量稍低 - 但它不会阻塞。通常,不需要高级或长期加密的应用程序可以可靠地使用/dev/urandom

请稍等片刻,然后再次阅读/dev/urandom。你可能已经从/dev/random中耗尽了内部熵池读数,打破了两个生成器 - 允许你的系统创建更多的熵来补充它们。

有关/dev/random/dev/urandom

的详情,请参阅Wikipedia

答案 1 :(得分:21)

这个问题很老了。但仍然相关,所以我会给出答案。今天许多CPU都带有内置的硬件随机数发生器(RNG)。同样,许多系统都带有可信平台模块(TPM),它也提供RNG。还有其他选择可以购买,但你的计算机已经有了一些东西。

您可以在大多数Linux发行版中使用rng-utils包中的rngd来播种更多随机数据。例如在Fedora 18上我只需要做一些来启用TPM和CPU RNG(RDRAND指令)的播种:

# systemctl enable rngd
# systemctl start rngd

您可以使用和不使用rngd来比较速度。从命令行运行rngd -v -f是个好主意。这将显示检测到的熵源。确保加载了支持源的所有必要模块。要使用TPM,需要通过tpm-tools激活它。 更新:此处为nice howto

顺便说一下,我在互联网上读过一些关于TPM RNG的担忧经常以不同的方式被打破,但没有读出任何针对英特尔,AMD和VIA芯片中发现的RNG的具体内容。如果你真的关心随机性质,那么使用多个来源是最好的。

对于大多数用例来说,urandom是有用的(除了有时在早期启动期间)。现在大多数程序都使用urandom而不是随机。甚至openssl does that。请参阅myths about urandomcomparison of random interfaces

最近Fedora和RHEL/CentOS rng-tools也支持jitter entropy。您可以选择缺少硬件选项,或者只是信任它而不是硬件。

更新:更多熵的另一个选项是HAVEGED(质疑质量)。在虚拟机上有一个kvm / qemu VirtIORNG(推荐)。

答案 2 :(得分:10)

使用/ dev / urandom,它的加密安全。

好读:http://www.2uo.de/myths-about-urandom/

“如果你不确定是否应该使用/ dev / random或/ dev / urandom,那么你可能想要使用后者。”

如果在早期开机时有疑问,那么你就会收集到足够的熵。请改用系统调用getrandom()。 [1] 两全其美,

  • 它阻止(只有一次!)足够的熵被收集,
  • 之后它永远不会再次阻止。

[1] git kernel commit

答案 3 :(得分:1)

如果您想要更多/dev/random的熵,那么您需要购买硬件RNG或使用其中一个*_entropyd daemons来生成它。

答案 4 :(得分:1)

如果你使用随机性进行测试(不是加密),那么可重复的随机性更好,你可以从已知种子开始的伪随机性得到这个。在大多数语言中,通常都有一个很好的库函数。

这是可重复的,因为当您发现问题并尝试调试时。它也不会吃掉熵。可以从/ dev / urandom播种伪随机生成器,并将种子记录在测试日志中。 Perl有一个你可以使用的伪随机数生成器。

答案 5 :(得分:0)

这为我解决了。 使用新的SecureRandom()代替SecureRandom.getInstanceStrong()

更多信息可以在这里找到: https://tersesystems.com/blog/2015/12/17/the-right-way-to-use-securerandom/