我对 SecureRandom
的用法有点困惑。我需要在循环中生成 n secure 随机数。为每一代使用相同的 SecureRandom 实例是否安全?以下解决方案在加密强度方面是否存在差异?
1) 没有种子的单实例
SecureRandom sr = new SecureRandom();
for(int i = 0; i < n; ++i) sr.nextInt();
2)每一代的新实例
for(int i = 0; i < n; ++i) new SecureRandom().nextInt();
3) 带种子的单实例
SecureRandom sr = new SecureRandom()
for(int i = 0; i < n; ++i) {
byte[] seed = sr.generateSeed(32);
sr.setSeed(seed);
sr.nextInt();
}
最佳答案
也许与直觉相反,第三个几乎肯定是最弱的,在循环迭代中重新播种是一个糟糕的主意。第二个是坏的,但没那么坏,因为 SecureRandom()
包括一个 strong 默认的播种策略。正如所问,第一个几乎肯定是最安全的,因为它最大化了熵周期。出于这个原因,我建议您将它提取到类级别常量。
private static final Random RANDOM = new SecureRandom();
// ...
// your method,
for (int i = 0; i < n; ++i) {
int num = RANDOM.nextInt();
}
关于java - 重复使用 Java 的 SecureRandom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27641981/