SecureRandom 速度过慢或冻结系统

Mic*_*app 6 java random freeze jenkins secure-random

java 应用程序执行如下操作:

\n
SecureRandom random = new SecureRandom();\nfor(int i=0;i<12;i++){\n   random.nextInt(19);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

Mic*_*app 7

解决方案1(更改代码)

\n

ThreadLocalRandom.current().nextInt()代替使用。

\n

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

\n\n

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

\n

将 JVM 参数添加到运行程序:\n-Djava.security.egd=file:/dev/./urandom

\n

这是为什么?

\n

所以这有点棘手。
\nSecureRandom依赖于操作系统随机生成器,这是/dev/random默认的。
\n/dev/random依赖于环境噪音,例如鼠标输入。
\n如果环境噪音不够,/dev/random则被设计阻挡。(实际上取决于 Linux 发行版)
\n繁荣!在本地,你总是有系统噪音,但在詹金斯代理上可能不会。

\n

来源

\n\n