我们使用SecureRandom
如下(使用Java8
):
import java.security.SecureRandom;
private SecureRandom random = new SecureRandom();
正在使用的算法是NativePRNG
.
我们应该定期播种吗?
正如它所写的那样,NativePRNG 不断地从操作系统接收熵(通过从 /dev/(u)random 读取)
你怎么看?
我们使用SecureRandom
如下(使用Java8
):
import java.security.SecureRandom;
private SecureRandom random = new SecureRandom();
正在使用的算法是NativePRNG
.
我们应该定期播种吗?
正如它所写的那样,NativePRNG 不断地从操作系统接收熵(通过从 /dev/(u)random 读取)
你怎么看?
https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/建议在生成“大量 PRNG 输出”时重新设置 SecureRandom 实例。但是,它并没有具体说明什么算作大量。这可能取决于使用的 SecureRandom 算法。
Java 文档没有说明会进行重新播种。如果特定算法支持它,则需要在调用时明确指定该算法SecureRandom.getInstance
。
在 Java 9 中添加了基于 NIST.SP.800-90Ar1 的 DRBG 实现 ( JEP 273 )。这指定生成器应在种子寿命结束时自行重新播种。您还可以看到这是相应地实现的:(sun.security.provider.AbstractDrbg
字段reseedCounter
)
但是,请记住,并不要求所有 Java 平台都需要支持 DRBG(尽管可能大多数都需要)。因此,处理它不可用的情况或包括提供 DRBG 的安全提供程序。
Java8 文档说: SecureRandom 必须产生不确定的输出。