使用 Random 播种时 SecureRandom 会变弱吗?

Is SecureRandom weaken when seed with Random?

来自 java.util.Random 的用于 java.security.SecureRandom 的种子是否会削弱加密强度高的随机数生成器?

我看到这段代码,想知道为什么要以这种特定方式完成。

randomGenerator = new SecureRandom();
final Random rnd = new Random();
randomGenerator.setSeed(rnd.nextLong());

根据文档,setSeed 的调用永远不会降低随机性。那么为什么要调用 setSeed 呢?

public void setSeed(long seed)
Reseeds this random object, using the eight bytes contained in the given long seed. The given seed supplements, rather than replaces, the existing seed. Thus, repeated calls are guaranteed never to reduce randomness.
docs.oracle.com

使用 CSPRNG 时,加密强度与用于播种的熵的位强度相同。

CSPRNG 会产生几乎无限量的伪随机熵,但实际上伪随机熵的实际强度仅与 CSPRNG 的基本种子状态的熵一样强。

因此,如果您 仅使用 来自 java.util.Random 的种子,您就会遇到麻烦。

谢天谢地,内核和其他资源用于为 java.security.SecureRandom 使用的系统 CSPRNG 提供种子,因此如上面的示例代码所示“添加”/混入其中,无法实现“更少”随机或减少熵。

所以:

  1. 是的,java.util.Random 种子一文不值。
  2. 这没关系,因为系统已经从硬件中断、启动抖动和其他噪音中播种了 CSPRNG。
  3. 无论是谁写的:randomGenerator.setSeed(rnd.nextLong()); 不应参与密码工程。