1

一个 java 应用程序做这样的事情:

SecureRandom random = new SecureRandom();
for(int i=0;i<12;i++){
   random.nextInt(19);
}

在 random.nextInt() 中,java 冻结了几分钟,似乎它无限期地挂起。
奇怪的是,该行为仅在我通过 Jenkins 运行时才存在,并且我无法在本地重现该问题。
同样在生产中,代码工作正常。
jenkins 代理是 Ubuntu,但是如果我将其更改为 macOS 代理,它可以正常工作。
生产在 openSUSE 上运行。
这里有什么魔力?

4

1 回答 1

2

解决方案1(更改代码)

改为使用ThreadLocalRandom.current().nextInt()

编辑: ThreadLocalRandom 不是“安全的”。
仅当您的案例对安全不敏感时才使用此选项。
SecureRandom 符合 FIPS 140-2,请参阅:

解决方案2(不释放,仍然安全)

向运行器添加 JVM 参数: -Djava.security.egd=file:/dev/./urandom

这是为什么?

所以这有点棘手。
SecureRandom依赖于/dev/random默认情况下的 OS 随机生成器。
/dev/random依赖于环境噪声,例如鼠标输入。
如果没有足够的环境噪音,/dev/random则被设计阻止。(实际上取决于 linux 发行版)
Boom!在本地,您一直有系统噪音,但在詹金斯代理上可能没有。

资源

于 2022-01-19T10:21:20.067 回答