【问题标题】:Is SecureRandom weaken when seed with Random?使用 Random 播种时 SecureRandom 会减弱吗?
【发布时间】:2021-05-27 12:55:38
【问题描述】:

来自java.util.Randomjava.security.SecureRandom 的种子能否削弱加密性强的随机数生成器?

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

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

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

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

【问题讨论】:

  • 那么为什么还要调用 setSeed 呢? 因为加密令人困惑,代码的作者也很困惑。

标签: java random cryptography


【解决方案1】:

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

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

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

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

所以:

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

【讨论】:

    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    相关资源
    最近更新 更多