重复使用Java的SecureRandom

ovu*_*tin 8 java security random cryptography

我对使用它有点困惑SecureRandom.我需要在循环中生成n个 安全随机数.为每一代使用相同的SecureRandom实例是否安全?以下解决方案在加密强度方面有什么区别吗?

1)没有播种的单个实例

SecureRandom sr = new SecureRandom();
for(int i = 0; i < n; ++i) sr.nextInt();
Run Code Online (Sandbox Code Playgroud)

2)每一代的新实例

for(int i = 0; i < n; ++i) new SecureRandom().nextInt();
Run Code Online (Sandbox Code Playgroud)

3)带有播种的单个实例

SecureRandom sr = new SecureRandom()
for(int i = 0; i < n; ++i) {
    byte[] seed = sr.generateSeed(32);
    sr.setSeed(seed);
    sr.nextInt();
}
Run Code Online (Sandbox Code Playgroud)

Ell*_*sch 11

也许与直觉相反,第三种几乎肯定是最弱的,重复循环迭代是一个可怕的想法.第二个是糟糕的,但不那么糟糕,因为它SecureRandom()包含一个强大的默认播种策略.正如所提出的,第一个几乎肯定是最安全的,因为它最大化了熵期.因为这个原因,我建议你将它提取到类级别常量.

private static final Random RANDOM = new SecureRandom();
// ...
// your method,
for (int i = 0; i < n; ++i) { 
    int num = RANDOM.nextInt();
}
Run Code Online (Sandbox Code Playgroud)

  • *"也许与直觉相反,第三种几乎肯定是最弱的,重复循环迭代是一个可怕的想法......"* - 有一些论文可能不同意你.论文建议在要求发电机产生钻头之前重新安装发电机. (2认同)