更新到内核 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 个可用熵吗?
答案1
无意与马库斯的完整答案竞争。只是为了解释发生的事情并证明您注意到的不是错误。
默认池大小是硬编码的,drivers/char/random.c
但在 5.10.119 中实际上发生了一些变化:
截至 2011 年 10 月 5 日:
#define INPUT_POOL_SHIFT 12
#define INPUT_POOL_WORDS (1 << (INPUT_POOL_SHIFT-5))
...
static int sysctl_poolsize = INPUT_POOL_WORDS * 32;
(2^(12-5))x32=4096
5.10.119 以下, poolsize 的计算方式似乎有所不同:
POOL_BITS = BLAKE2S_HASH_SIZE * 8
...
static int sysctl_poolsize = POOL_BITS;
BLAKE2S_HASH_SIZE = 32,如中定义include/crypto/blake2s.h
8x32=256您注意到的不是一个错误……它是一个功能!
顺便说一句,这只是一个默认值,如果您知道它不符合您的需求,请随意更改它。
注意:此更改涉及主线,因为 5.17-rc1 从 119 向后移植到 5.10,但也从 44 向后移植到更新的 LTS:5.15。5.4 似乎并不关心(还?),当然,5.16 永远不会。
正如 @TooTea 在评论中恰巧建议的那样,此举的原因可以解读为初始提交, 简而言之 :
- 提高安全性(如果池的状态泄漏,其内容可以被控制并完全归零。)
- 更好的性能(在高端 CPU 上高达 225%)
这是通过直接调用 BLAKE2 替换 4096 LFSR 来实现的。
BLAKE2s 输出 256 位,这应该为我们提供适当的最小熵累积量,以及针对主动攻击的足够宽的抗碰撞裕度。
答案2
我们可以。
您也可以在之前显示相同的值时 - “熵”只是一个疯狂的猜测,有多少随机源可用于修改伪随机数生成器的状态。即使有不新的熵,该生成器仍然是值得信赖的– 除非有人弄清楚了状态(应该不可能)。
因此,即使对于私钥生成之类的事情,使用 /dev/urandom (即使无法从外部熵源修改其状态,它也会使用 PRNG)和使用 /dev/random (如果没有任何内容可以修改状态,则会阻塞)之间没有安全差异,除非你假设攻击者可能已经通过某种奇妙的措施知道了内核内部 PRNG 的状态(或者因为你在一个非常有限的设备上早期启动了 Linux,没有熵源,并且状态是确定性的,但是然后一旦你有几百位熵,任何加密安全的 PRNG 都会这么说。没有人从随机生成器获取数据可以成功猜测其内部状态)。
唯一的区别实际上是,如果熵为零,则已经加密安全的 PRNG 不会被重新播种。 “储存”有 3000 或 256 个熵根本不重要。唯一有影响的是你是否能是否重新播种。 (正如前面所说,即使这并不重要,除非你做了一些我不会将其称为“密码学上常见的”的事情:你真正需要多久创建一个一次性的密码本,没有攻击者完全了解你的密码?计算机的状态为一生成之前的时间点无法破解?因为“攻击者无所不知,足以在某个时候推断出你的 PRNG 的加密状态”,而不是“NSA 试图破解 RSA”之类的东西。)
老实说,
这是一个错误吗?你能相信这个内核的新随机数生成器只有 256 个可用熵吗?
您需要假设您的内核不会引入安全措施的削弱。否则,随机性来源中的理论熵不是您的问题,而是内核故意以某种方式使其具有确定性,而没有告诉您:)
如果您不相信您的内核没有安全回归,那么您就已经失败了,因为您无法相信您的计算机能够提供您认为应该提供的数字。 Sooooo...是的,您可以,或者您很久以前就需要开始构建自己的操作系统,而不仅仅是通过此更新改变了显示的熵。
长话短说:只要你的电脑没有受到熵不够曾经,您正在生成安全号码。即使在开始获取随机数之前只使用一次 256 熵,然后在系统的剩余生命周期中使用 0 就可以了!任何时候都拥有 256 个比以往任何时候都更加必要。