为什么随机种子只在启动和关闭时保存到磁盘?

yt7*_*7q- 4 linux random

在我的系统上,有/var/lib/systemd/random-seed. 在启动时,它将它加载到熵池中并替换为一个新的。在关闭时,熵被保存到它。我没有发现任何改变它之间的东西。

如果有一台计算机仅在断电时关闭,那么它收集的熵将不会写入磁盘。因此,从断电中恢复时需要时间来收集熵。

为什么在正常操作期间不将熵保存到磁盘,例如每天一次?

Jde*_*eBP 6

它有助于停止将其视为“熵”。这与熵没有任何关系,错误地从熵的角度考虑伪随机数生成是对这个主题的许多误解的根源。所以不要再想“熵”了。

顾名思义,这是一个伪随机数生成器种子值。

关于 PRNG 需要记住的是,它们不是随机的。它们完全是确定性的。如果知道初始输入值和特定的 PRNG 算法,就可以确定每个未来的“随机”输出值。

在这种情况下,算法是众所周知的。毕竟,它是作为开源内核的一部分发布的。所以随机性的关键是种子。提供的“随机性”级别是不可预测的,从一个输出到下一个。知道算法和之前的输出但不知道种子,很难预测下一个随机输出是什么。(这不是对 PRNG加密安全意味着什么的正式或完整定义;但出于本答案的目的,将作为有限的近似值。)

这是引起广泛讨论的 Linux 问题的基本原因/dev/urandom,我将在这里略过。在引导时,种子也是众所周知的。随机输出都是完全可预测的,直到PRNG 被重新播种,即第一次提供与该操作系统安装的运行唯一(或尽可能接近)的新鲜种子。

这就是/var/lib/systemd/random-seed(在 systemd 操作系统上)、/var/lib/urandom/random-seed(在非 systemd Linux 操作系统上)和/var/db/entropy-file(在 FreeBSD/TrueOS 上)的全部内容:持有可以应用的重新播种值,作为第一个重新播种值,下一次引导后尽快。

重要的是,一旦它在引导程序中使用,它就会立即被另一个不同的种子值替换。正如您所猜测的那样,如果系统没有完全关闭,它不会使用与前面引导程序相同的种子值重新引导。

因此,引导程序和关机之间更改它是毫无意义的。它必须在被读取和使用后立即更改,并且在操作系统运行的生命周期内对替换进行保密。但是在此期间反复更新它是没有意义的,除非它的价值以某种方式暴露了出来。

种子值不是某种累积的“熵”。这是一个秘密。它是下一次运行 PRNG 的种子值。它不应该暴露在可信计算基础之外,并且应该很难预测。具有讽刺意味的是,因为它只需要是不可预测的,所以它实际上可以是 PRNG 本身的输出,而实际上就是这样的工具systemd-random-seed,它从重新播种的 PRNG 中获取输出作为下一个引导程序的下一个种子值.

因此,在关闭时更改它的基本原理是,如果在操作系统运行时以某种方式暴露了下一个种子值,则在关闭时替换它会使攻击者更难了解接下来要播种的 PRNG和。

这包括被暴露,因为它是可预测的。理论上,如果您知道每个种子都是通过立即针对前一个种子运行 PRNG 获得的,那么了解任何种子都可以让您确定所有后续种子。幸运的是,随着操作系统的运行,PRNG还会定期从其他种子源中进一步重新播种,因此从 PRNG 输出中获取并在关闭时存储的下一个种子值是不可预测的,即使人们知道之前的种子是在引导程序中用于操作系统的当前运行。

当您从中央公共映像“克隆”系统时,这种保密性扩展到不复制它。

所以,总结一下:下一个种子值不是“熵”。它不会在任何有意义的意义上产生,因此不需要在运行时以某种方式构建或“刷新”。它需要在使用时立即更换,并且为了使种子序列本身成为不可预测的序列,否则下一个种子是 PRNG 和最后一个种子的完全可预测的输出,它也应该从 PRNG 输出更新一次,在PRNG之后的某一点已被重新接种于第二时间,为此,关机时间是一个很好的(但并不完美)近似,由于启动和关闭操作系统之间的某个时候会做自己的重新播种。

进一步阅读

  • 如果循环是“启动 -> 加载+覆盖种子 -> [时间流逝] -> 断电 -> (重复)”,如 yt7b97q- 所描述的,那么,正如您所说,捕获任何种子都可以访问所有未来的启动种子。收集熵后,定期再次覆盖种子文件是有意义的。我认为 yt7b97q- 提出了一个很好的观点,但您并没有真正回答这个问题*为什么随机引擎的作者选择不这样做*。我怀疑答案只是“这不是一个选择,这只是他们没有想到的场景”,但仍然如此。 (2认同)