kernel 5.10.119 导致 /proc/sys/kernel/random/entropy_avail 和 poolsize 的值为 256

use*_*206 22 proc random sysctl linux-kernel

更新到内核 5.10.119 后,/proc/sys/kernel/random/entropy_avail卡在 256 并且移动鼠标时不会改变。以前是3000多。

# cat /proc/sys/kernel/random/entropy_avail  
256
Run Code Online (Sandbox Code Playgroud)

另外,/proc/sys/kernel/random/poolsize下降到 256。以前是 4096。

这是一个错误吗?你能相信这个内核的新随机数生成器只有 256 个可用熵吗?

MC6*_*020 22

无意与马库斯的完整答案竞争。只是为了解释发生的事情并证明您注意到的不是错误。

\n

默认池大小是硬编码的drivers/char/random.c,但在 5.10.119 中实际上发生了一些变化:

\n

截至 2011 年 10 月 5 日

\n
#define INPUT_POOL_SHIFT    12\n#define INPUT_POOL_WORDS    (1 << (INPUT_POOL_SHIFT-5))\n...\nstatic int sysctl_poolsize = INPUT_POOL_WORDS * 32;\n
Run Code Online (Sandbox Code Playgroud)\n

(2^(12-5))x32=4096

\n

在 5.10.119 下,池大小的计算方式不同:

\n
POOL_BITS = BLAKE2S_HASH_SIZE * 8\n...\nstatic int sysctl_poolsize = POOL_BITS;\n
Run Code Online (Sandbox Code Playgroud)\n

BLAKE2S_HASH_SIZE = 32,如中定义include/crypto/blake2s.h

\n

8x32=256你注意到的不是一个 bug\xe2\x80\xa6 它:一个功能!

\n

顺便说一句,这只是一个默认值,如果您知道它不符合您的需求,请随意更改它。

\n
\n

注意:此更改涉及主线,因为 5.17-rc1 从 119 向后移植到 5.10,但也从 44 向后移植到更新的 LTS:5.15。5.4 似乎并不关心(还?),当然,5.16 永远不会。

\n
\n

正如@TooTea 在评论中恰巧建议的那样,移动的原因可以理解为初始提交的一部分,简而言之:

\n
    \n
  • 提高安全性(如果池的状态泄漏,其内容可以被控制并完全归零。)
  • \n
  • 更好的性能(在高端 CPU 上高达 225%)
  • \n
\n

这是通过直接调用 BLAKE2 替换 4096 LFSR 来实现的。

\n
\n

BLAKE2s 输出 256 位,这应该为我们提供适当的最小熵累积量,以及足够宽的碰撞裕度以抵抗主动攻击。

\n
\n

  • 原始提交中概述了从旧的“大熵池”方法切换到 BLAKE2 的原因:https://lore.kernel.org/lkml/20220527084855.501642285@linuxfoundation.org/ (2认同)

Mar*_*ler 11

我们可以。

\n

您之前也可以,当显示相同的值 \xe2\x80\x93 时,“熵”只是一个疯狂的猜测,有多少随机源可用于修改伪随机数生成器的状态。即使没有的熵,该生成器仍然是值得信赖的\xe2\x80\x93 ,除非有人弄清楚了状态(这应该是不可能的)。

\n

因此,即使对于私钥生成之类的事情,使用 /dev/urandom (它使用 PRNG,即使它无法从外部熵源修改其状态)和使用 /dev/random (它会阻止 if没有什么可以修改状态)除非你假设攻击者可能已经通过某种奇妙的措施知道了内核内部 PRNG 的状态(或者因为你在一个非常有限的设备上提前启动了 Linux,没有熵源) ,并且状态是确定性的,但是你的熵只是 0。一旦你有几百位的熵,任何加密安全的 PRNG 都会说,从随机生成器获取数据的任何人都无法成功猜测其内部状态)。

\n

唯一的区别实际上是,如果熵为零,则已经加密安全的 PRNG 不会被重新播种。“存储”有 3000 或 256 个熵根本不重要。唯一有影响的是你是否可以重新播种。(正如前面所说,即使这并不重要,除非你做了一些我不会将其称为“密码学上常见的”的事情:你真正需要多久创建一个一次性的密码本,没有攻击者完全了解你的密码?计算机在生成之前某个时间点的状态无法破解?因为“攻击者无所不知,足以推断出您在某个时间的加密 PRNG 状态”,而不是“NSA 试图破解 RSA”或其他什么。)

\n

老实说,

\n
\n

这是一个错误吗?你能相信这个内核的新随机数生成器只有 256 个可用熵吗?

\n
\n

您需要假设您的内核不会引入安全措施的削弱。否则,随机性来源中的理论熵不是您的问题,而是内核故意以某种方式使其具有确定性,而没有告诉您:)

\n

如果您不相信您的内核没有安全回归,那么您就已经失败了,因为您无法相信您的计算机能够提供您认为应该提供的数字。Sooooo...是的,您可以,或者您很久以前就需要开始构建自己的操作系统,而不仅仅是通过此更新改变了显示的熵。

\n

TL;DR:只要您的计算机不遭受不足的困扰,您就可以生成安全数字。即使在开始获取随机数之前只使用一次 256 熵,然后在系统的剩余生命周期中使用 0 就可以了!任何时候都拥有 256 个比以往任何时候都更加必要。

\n