首页 > 解决方案 > 使用 Random 播种时 SecureRandom 会减弱吗?

问题描述

java.util.Random来自for的种子会java.security.SecureRandom削弱加密强大的随机数生成器吗?

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

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

从文档来看,调用setSeed永远不会减少随机性。那为什么还要setSeed调用呢?

public void setSeed(long seed)
使用给定长种子中包含的八个字节重新设置此随机对象的种子。给定的种子是对现有种子的补充,而不是替代。因此,保证重复调用永远不会减少随机性。
docs.oracle.com

标签: javarandomcryptography

解决方案


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

CSPRNG 将产生几乎无限量的伪随机熵,尽管实际上该伪随机熵的实际强度仅与 CSPRNG 的潜在种子状态的熵一样强。

因此,如果您只使用您种子,java.util.Random就会有麻烦。

值得庆幸的是,内核和其他来源用于播种使用的系统 CSPRNG,java.security.SecureRandom因此如上面的示例代码所示“添加”/混合到其中,不能使其“减少”随机性或减少熵。

所以:

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

推荐阅读