使用Random种子时SecureRandom是否会减弱?
来自java.util.Randomfor的种子可以java.security.SecureRandom削弱加密强随机数生成器吗?
我看到了这段代码,想知道为什么要以这种特定方式完成。
randomGenerator = new SecureRandom();
final Random rnd = new Random();
randomGenerator.setSeed(rnd.nextLong());
从文档来看,调用setSeed永远不会减少随机性。那么为什么要setSeed调用呢?
public void setSeed(long seed)
使用给定长种子中包含的 8 个字节为该随机对象重新设定种子。给定的种子补充而不是替换现有的种子。因此,保证重复调用永远不会减少随机性。
docs.oracle.com
回答
使用 CSPRNG 时,加密强度与用于播种它的熵的位强度相同。
CSPRNG 将产生几乎无限量的伪随机熵,但实际上,该伪随机熵的实际强度仅与 CSPRNG 的潜在种子状态的熵一样强。
因此,如果您仅使用来自java.util.Random您的种子,则会遇到麻烦。
值得庆幸的是,内核和其他来源用于为所使用的系统 CSPRNG 提供种子java.security.SecureRandom,因此如上面的示例代码所示,“添加”/混合到其中,不能使其“减少”随机或减少熵。
所以:
- 是的,
java.util.Random种子毫无价值。 - 不过这是可以的,因为系统已经从硬件中断、启动抖动和其他噪声中植入了 CSPRNG。
- 写这篇文章的人:
randomGenerator.setSeed(rnd.nextLong());不应该参与密码工程。