/ dev/random非常慢?

Mr.*_*ama 43 linux terminal

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

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

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

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

Tim*_*Tim 48

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

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

尝试等待一会儿再读/dev/urandom一遍.你可能已经耗尽了内部熵池的读数/dev/random,打破了两个生成器 - 允许你的系统创建更多的熵应该补充它们.

有关和的更多信息,请参阅维基百科./dev/random/dev/urandom

  • @Tim/dev/random和/ dev/urandom都来自同一个CSPRNG.考虑到现有时间,密码分析和计算能力,/ dev/urandom与真随机无法区分.不知何故/ dev/random比/ dev/urandom更"真正随机"的神话只是一个神话./ dev/random只有输入熵池的块被耗尽或者阻塞熵池中的数据少于160位.但它使用与/ dev/urandom相同的CSPRNG,两者之间没有实际区别.除非你看起来像一些信息理论alg.道德?使用/ dev/urandom. (8认同)

ako*_*nov 21

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

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

# systemctl enable rngd
# systemctl start rngd
Run Code Online (Sandbox Code Playgroud)

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

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

urandom适用于大多数用例(有时在早期启动期间除外).现在大多数程序都使用urandom而不是随机.即使是openssl 也是如此.查看关于urandom随机接口比较的神话.

在最近的Fedora和RHEL/CentOS rng-tools中也支持抖动熵.您可以缺少硬件选项,或者只是信任它而不是硬件.

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

  • 谢谢你!!!对于 Ubuntu 20.04,软件包和服务名称都是 **rng-tools** (2认同)

har*_*rmv 10

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

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

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

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

  • 它会阻塞(只有一次!)足够的熵,
  • 之后它永远不会再次阻止.

[1] git内核提交

  • 为什么这个答案被低估?这似乎是一个很好的答案......但也许我错过了它的问题. (3认同)