在java中播种安全随机



我希望在java中使用SecureRandom生成随机整数。

private SecureRandom myRandom = new SecureRandom();
private int myInt = 10;
int myResults;
myResults = myRandom.nextInt(myInt);

我理解播种意味着为随机数生成器指定一个起点。我是否应该在每次迭代后重新播种随机数生成器以确保随机性?

No。如果你第一次没有提供一个种子,SecureRandom将自己播种,如果它使用伪随机生成器,那么后续的随机数将是不可预测的。

事实上,如果您尝试重新播种它,您可能会降低所生成随机数的安全性,因为您必须从某处获得新的种子(并且这可能不如SecureRandom的实现那样是一个好的随机性来源)。

根据https://www.synopsys.com/blogs/software-security/proper-use-of-javas-securerandom/,如果您正在为数量的随机数使用SecureRandom,则应该定期重新播种它,因此

定期丢弃现有的java.security.SecureRandom实例并创建一个新实例。这将生成一个新的实例一个新的种子。

通过调用,定期向PRNG种子中添加新的随机材料java.security.SecureRandom.setSeed (java.security.SecureRandom.generateSeed (int)) .

但是不要在每次调用后都重新播种

注意,SecureRandom的API将在Java 8中进行澄清:http://openjdk.java.net/jeps/123

最新更新