【问题标题】:Does calling Java SecureRandom.getInstance and nextBytes multiple times block on /dev/random?在 /dev/random 上多次调用 Java SecureRandom.getInstance 和 nextBytes 会阻塞吗?
【发布时间】:2016-10-27 21:24:13
【问题描述】:

我有一个被称为 N 次的文件加密方法。 在该方法中,这就是我创建盐的方式:

public void method(...){
      ...
      byte[] salt = new byte[8];
      SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG", 
          "SUN");
      secureRandom.nextBytes(salt);
      ...
}

我了解到 SecureRandom 对象在您调用 nextBytes 时被播种,并且只会在您第一次调用 nextBytes 时阻塞 /dev/random,因为该类的变量 seedGenerator 是静态的 (https://www.cigital.com/blog/securerandom-implementation/)。

JavaDocs on SecureRandom.getInstance(String algorithm, String provider) 说: 返回的 SecureRandom 对象尚未播种。要播种返回的对象,请调用 setSeed 方法。如果未调用 setSeed,则第一次调用 nextBytes 将强制 SecureRandom 对象自行播种。如果之前调用了 setSeed,则不会发生这种自播。

我的问题是,如果我继续创建 SecureRandom 实例并调用 nextBytes,我的代码会在 /dev/random 上阻塞吗?

提前致谢!

【问题讨论】:

    标签: java cryptography


    【解决方案1】:

    /dev/random 的第一次调用可能会阻塞,直到有足够的熵可用,这意味着如果您不手动播种,对nextBytes() 的第一次调用可能会阻塞。后续调用永远不应该阻塞,因为无论SecureRandom 的实现是什么,一旦获得熵,它就不会消失,因此从/dev/random 的后续读取不会阻塞(即,一旦/dev/random 的第一次读取成功,则没有后续读取/dev/random 应该会因为缺少熵而失败)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多