重复使用Java的SecureRandom

时间:2014-12-24 20:40:57

标签: java security random cryptography

我对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();
}

2 个答案:

答案 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用于大量随机输出,则应定期将其重新设置为不允许恶意软件确定种子,从而预测所有未来输出。