java - 重复使用 Java 的 SecureRandom

标签 java security random cryptography

我对 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/

相关文章:

java - 在java中创建一个参差不齐/锯齿状的3d数组

security - CouchDB 身份验证

python - Pandas 数据框中的随机行选择

random - Rust GSL 库总是为随机数生成器返回相同的数字

java - 如何用java中给定的替换映射替换某些单词?

java - 建议 SCJP 模拟测试的 URL 或链接

c# - 在真实场景中实现身份服务器身份验证

php - 如何获取本地网站的SSL证书

mysql - 在特定时间间隔的随机结果(根据列数据)

java - 如何确定 ResultSet 中是否存在列名?