SecureRandom 速度过慢或冻结系统

问题描述 投票:0回答:2

Java 应用程序执行以下操作:

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

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

java jenkins random freeze secure-random
2个回答
6
投票

解决方案1(更改代码)

请使用

ThreadLocalRandom.current().nextInt()
来代替。

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

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

向运行器添加 JVM 参数:

-Djava.security.egd=file:/dev/./urandom

这是为什么?

所以这有点棘手。

SecureRandom
依赖于操作系统随机生成器,默认为
/dev/random

/dev/random
依赖于环境噪音,例如鼠标输入。
如果环境噪音不够,
/dev/random
会被设计阻挡。 (实际上取决于Linux发行版)
繁荣! 在本地,你一直有系统噪音,但在詹金斯代理上可能不会。

来源


© www.soinside.com 2019 - 2024. All rights reserved.