【问题标题】:Getting linux to buffer /dev/random让 linux 缓冲 /dev/random
【发布时间】:2011-04-12 10:36:15
【问题描述】:

我需要为我正在编写的应用程序提供合理的高质量随机数据。 Linux 为此提供了 /dev/random 文件,这是理想的;但是,由于我的服务器是单服务虚拟机,它的熵源非常有限,这意味着 /dev/random 很快就会耗尽。

我注意到,如果我从 /dev/random 读取数据,我只会在设备阻塞之前获得 16 个左右的随机字节,而它会等待更多的熵:

[duke@poopz ~]# hexdump /dev/random
0000000 f4d3 8e1e 447a e0e3 d937 a595 1df9 d6c5
<process blocks...>

如果我终止这个过程,离开一小时并重复命令,再次只产生大约 16 个字节的随机数据。

然而 - 如果我让命令运行相同的时间,则会收集更多、更多的随机数据。我由此假设,在给定的时间段内,系统会产生大量熵,但 Linux 仅在您实际从 /dev/random 读取时才使用它,如果不是,则丢弃它。如果是这种情况,我的问题是:

是否可以将 Linux 配置为缓冲 /dev/random,以便从中读取大量高质量随机数据?

将 /dev/random 作为程序的一部分进行缓冲对我来说并不难,但我觉得在系统级别这样做会更优雅。我还想知道让 Linux 在内存中缓冲其随机数据是否会产生安全隐患。

【问题讨论】:

  • AFAIK,熵不会(完全)丢弃,当熵足够高时,内核会在 4096 个输入样本中抽取 1 个样本并将其混合到其熵池中。

标签: linux random buffer daemon entropy


【解决方案1】:

听起来您需要一个 entropy deamon 来从其他来源提供熵池。

【讨论】:

  • 我刚刚安装了它,它似乎确实可以更快地补充 /dev/random,这很好。但是,/dev/random 仍然表现出相同的行为:如果我将其放置 10 分钟然后从中读取,则只会产生 16 个左右的字节。但是,如果我让它在同一时间段内不断地读取 /dev/random,则可以检索到许多千字节的随机数据。显然,该系统已经提供了丰富的随机性。因此,如果 Linux 将所有数据保存在缓冲区中以备不时之需,而不是将其丢弃,那不是很好吗?
  • 是的,我认为它是这样工作的。我认为他们不想在内核中缓冲大量数据。我想一个定期读取它并保持更大缓冲区的守护进程会起作用。
  • 这是我需要的那种缓冲守护进程 :D 但它存在吗..?
【解决方案2】:

使用 /dev/urandom。

/dev/random 的对应项是 /dev/urandom(“解锁”/非阻塞 随机源[4]),它重用 内部池生产更多 伪随机位。这意味着 呼叫不会阻塞,但 输出可能包含的熵小于 相应的读取 /开发/随机。虽然它还在 用作伪随机数 适用于大多数的发电机 加密目的,它不是 推荐用于生成 长期加密密钥。

【讨论】:

  • 是的,我会查看 /dev/urandom 但决定不使用它,因为我需要高质量的随机性。
【解决方案3】:

您有或者可以购买兼容 Linux 的硬件随机数生成器吗?这可能是您潜在问题的解决方案。见http://www.linuxcertified.com/hw_random.html

【讨论】:

  • 是的,这将是理想的,我见过一些 USB 熵发生器加密狗,而且我听说您也可以使用来自音频输入设备的噪音。然而,这个特定的系统只是世界另一端的廉价虚拟机。从我的测试来看,随着时间的推移,它确实为我的应用程序产生了足够的熵——但它不会收集它,所以缓冲区似乎是最便宜的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
相关资源
最近更新 更多