我对SecureRandom
的使用感到有点困惑。我需要在循环中生成 n 安全随机数。为每一代使用相同的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();
}
答案 0 :(得分:11)
也许与直觉相反,第三种几乎肯定是最弱的,重复循环迭代是一个可怕的想法。第二个是糟糕的,但不那么糟糕,因为SecureRandom()
包含强默认播种策略。正如所提出的,第一个几乎肯定是最安全的,因为它最大化了熵期。我建议你将它提取到类级别常量。
private static final Random RANDOM = new SecureRandom();
// ...
// your method,
for (int i = 0; i < n; ++i) {
int num = RANDOM.nextInt();
}
答案 1 :(得分:2)
我建议您阅读这篇有趣的article
通常,不需要创建多个SecureRandom()实例,因为@ElliottFrisch声明static final
是最合适的解决方案。
但是,如果您将SecureRandom用于大量随机输出,则应定期将其重新设置为不允许恶意软件确定种子,从而预测所有未来输出。