我应该定期重新播种 SecureRandom 还是自动发生?

Should I periodically reSeed SecureRandom or it occurs automatically?

我们使用 SecureRandom 如下(使用 Java8):

import java.security.SecureRandom;
private SecureRandom random = new SecureRandom();

正在使用的算法是NativePRNG

我们应该定期播种吗?

正如所写,NativePRNG 不断从操作系统接收熵(通过从 /dev/(u)random 读取)

你怎么看?

Java8 文档说:SecureRandom 必须产生不确定的输出。

https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/ 建议在生成 "large amount of PRNG output" 时重新播种 SecureRandom 实例。但是,它并没有具体说明什么算大额。这可能取决于使用的 SecureRandom 算法。

Java 文档并未说明将进行重新播种。如果特定算法支持它,则需要在调用 SecureRandom.getInstance.

时明确指定该算法

在Java中添加了9个DRBG实现(JEP 273) which are based on NIST.SP.800-90Ar1. This specifies that generators should reseed themself when the end of the seedlife has been reached. And you can also see that this is implemented accordingly: sun.security.provider.AbstractDrbg(字段reseedCounter

但是,请记住,并不要求所有 Java 平台都需要支持 DRBG(尽管很可能大多数都会支持)。因此,处理它不可用的情况或包含提供 DRBG 的安全提供程序。