进一步阅读

进一步阅读

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

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

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

答案1

它有助于停止将其视为“熵”。这与熵无关,错误地用熵来思考伪随机数生成是关于这个主题的许多误解的根源。所以不要再考虑“熵”了。

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

关于 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 重新播种后的某个时刻第二时间,对于这个关闭时间来说,这是一个很好的(但不是完美的)近似值,因为在启动和关闭之间的某个时间操作系统会进行自己的重新播种。

进一步阅读

相关内容