更新到内核 5.10.119 后,/proc/sys/kernel/random/entropy_avail 卡在 256 并且在移动鼠标时不会改变。它曾经超过3000。
# cat /proc/sys/kernel/random/entropy_avail
256
此外,/proc/sys/kernel/random/poolsize 下降到 256。它曾经是 4096。
这是一个错误吗?你能相信这个只有 256 个可用熵的内核的新随机数生成器吗?
更新到内核 5.10.119 后,/proc/sys/kernel/random/entropy_avail 卡在 256 并且在移动鼠标时不会改变。它曾经超过3000。
# cat /proc/sys/kernel/random/entropy_avail
256
此外,/proc/sys/kernel/random/poolsize 下降到 256。它曾经是 4096。
这是一个错误吗?你能相信这个只有 256 个可用熵的内核的新随机数生成器吗?
无意与马库斯的完整答案竞争。只是为了解释发生了什么并证明您注意到的不是错误。
默认池大小是硬编码的,
drivers/char/random.c
但实际上在 5.10.119 中发生了一些变化:高达 5.10.118:
(2^7)x32=4096
在 5.10.119 下,poolsize 的计算方式有所不同:
BLAKE2S_HASH_SIZE = 32 定义在 include/crypto/blake2s.h
8x32=256您注意到的不是错误……它:一个功能!
顺便说一句,这只是一个默认值,如果您知道它不符合您的需求,请随时更改它。
注意:此更改涉及主线,因为 5.17-rc1 从 119 向后移植到 5.10,但也到最近的 LTS:从 44 到 5.15。5.4 似乎并不关心(还?),当然,5.16 永远不会。
正如@TooTea 在评论中所建议的那样,移动的原因可以作为初始提交的一部分阅读,简而言之:
这是通过直接调用 BLAKE2 替换 4096 LFSR 来实现的。
我们可以。
您之前也可以,当显示相同的值时——“熵”只是一个疯狂的猜测,有多少随机源可用于修改伪随机数生成器的状态。即使没有新的熵,那个生成器仍然是值得信赖的——除非有人弄清楚了状态(这应该是不可能的)。
因此,即使对于像私钥生成这样的事情,使用 /dev/urandom (即使它无法从外部熵源修改其状态也使用 PRNG)和使用 /dev/random (如果没有什么可以修改状态的),除非您假设攻击者可能已经通过某种奇妙的措施知道了内核内部 PRNG 的状态(或者因为您在非常有限的设备上提前启动了 linux,没有熵源, 并且状态是确定性的, 但是你只是有 0 熵. 一旦你有几百位的熵, 任何加密安全的 PRNG 都说没有人从随机生成器获取数据可以成功猜测它的内部状态).
唯一的区别实际上是,如果熵为零,则已经加密安全的 PRNG 不会被重新播种。“存储”有 3000 或 256 个熵根本不重要。唯一不同的是您是否可以重新播种。(如前所述,除非您做一些我不会涵盖为“加密通常”的事情,否则即使这也无关紧要:您真正需要多久创建一次没有攻击者完全了解您的攻击者计算机在生成之前某个时间点的状态无法破解?因为“攻击者无所不知,足以在某个时间推断您的加密 PRNG 状态”是您要防范的,而不是“NSA 试图破解 RSA”或其他东西。)
老实说,
您需要假设您的内核不会削弱安全措施。否则,您的随机源中的理论熵不是您的问题,而是内核故意以某种方式使该确定性具有确定性,而没有告诉您:)
如果你不相信你的内核没有安全回归,那么你已经输了,因为你不能相信你的计算机能够提供你认为应该的数字。太好了……是的,您可以,或者您很久以前就需要开始构建自己的操作系统,而不仅仅是这个更新改变了显示的熵。
TL;DR:只要您的计算机从未遭受过足够的熵,您就可以生成安全数字。即使在开始获取随机数之前只有一次 256 熵,然后在系统的剩余生命周期中为 0 也可以!随时拥有 256 比以往任何时候都更加必要。