我从经验中知道,当 Linux 内核熵池用完熵时,从 /dev/random 中读取会阻塞。此外,我看到许多文章和博客文章指出,在 Linux 上运行时,java.security.SecureRandom 使用 /dev/random 作为其熵源,因此当内核熵池用完熵时会阻塞。
但是,我无法进行导致 SecureRandom 阻塞的实验。相反,似乎很容易获得一个从 /dev/random 读取的简单 bash 单行代码来阻止。
这是我用于这些实验的 java 代码:
import java.security.SecureRandom;
public class A {
public static void main(String[] args) {
SecureRandom sr = new SecureRandom();
int out = 0;
for (int i = 0; i < 1<<20 ; i++) {
out ^= sr.nextInt();
}
System.out.println(out);
}
}
它生成超过 1,000,000 个随机 32 位整数。那应该是 2^(20 + log2(32)) = 2^25 位或 2^22(略超过 400 万)字节的熵,对吧?但是,它从不阻塞。无论我是否摆动鼠标,它总是在大约 1.2 秒内完成。
我使用的 bash 单线是:
head -c 100 /dev/random | xxd
这很容易阻塞。只要我把手从鼠标和键盘上移开,它就会在那里闲置几分钟。我只要求 100 字节的熵。
当然,我在这里遗漏了一些东西。有人可以解释发生了什么吗?
谢谢!