CentOS7下Java8/11哪种urandom配置是正确的非阻塞SecureRandom算法
路径写法差异导致算法不同的原因
Java的Sun/OpenJDK安全提供者对NativePRNG算法的加载逻辑做了硬编码字符串匹配:只有当java.security.egd或者securerandom.source的配置值完全等于file:/dev/urandom或者file:/dev/random字符串时,才会加载NativePRNG算法,直接调用操作系统的对应设备生成随机数。/dev/./urandom虽然经过系统路径解析后和/dev/urandom指向同一个文件,但字符串本身和硬编码的匹配规则不一致,因此不会触发NativePRNG的加载逻辑,JDK会回退使用版本默认的SecureRandom算法:
- Java 8版本默认回退为
SHA1PRNG算法 - Java 11及更高版本默认回退为
DRBG算法
非阻塞随机数的配置选择
测试中出现的三种算法均可以实现非阻塞,区别如下:
NativePRNG:直接读取系统/dev/urandom生成随机数,天生非阻塞,不会出现随机数熵不足导致的进程挂起问题SHA1PRNG:算法本身是非阻塞的,只要种子来源配置为/dev/./urandom,就不会读取阻塞的/dev/random设备。早年Java版本存在/dev/urandom会被自动替换为/dev/random的bug,因此开发者普遍用/dev/./urandom绕开这个问题,通过SHA1PRNG实现非阻塞DRBG:Java 9+引入的新默认算法,符合NIST安全标准,性能和安全性都优于旧算法,只要种子源是urandom类路径,同样是非阻塞的
当前主流场景下的推荐配置:
- 如果你使用Java 8版本:可以任选
-Djava.security.egd=file:/dev/./urandom走SHA1PRNG,或者-Djava.security.egd=file:/dev/urandom走NativePRNG,两者都是非阻塞的 - 如果你使用Java 11及更高版本:更推荐用
-Djava.security.egd=file:/dev/./urandom走默认的DRBG算法,安全性和性能表现更优
内容的提问来源于stack exchange,提问作者SAGAR BHOOSHAN
相关产品推荐
相关产品推荐

