0

假设我需要好的种子来在 Java 程序中初始化伪随机生成器 (PRNG),并且我无法访问任何硬件随机生成器。

如何在没有任何用户交互的情况下从 JVM 获取熵?

4

2 回答 2

3

SHA-1 将被贬值

该漏洞与 CSPRNG 构建无关。

如何从 JVM 获取熵?

SecureRandom是各种安全提供程序的通用外观,包括特定于操作系统的熵源

于 2017-02-25T14:19:06.890 回答
2

您可以使用generateSeed(int)getSeed(int)静态检索也用于SecureRandom自身的种子输入。然后,您可以简单地使用该种子来播种您自己的 CSPRNG。

正如 8472 已经解释的那样,实际上几乎不需要这样做,但是如果您想生成自己的 CSPRNG(或 NIST 已知的 DRBG),那么没有什么能阻止您 - 只需在SecureRandom实现的构造函数中提供种子即可。

您自己产生更好熵的机会很小。您可以使用标准System.nanoTime()并使用命名错误的方法将其添加到 CSPRNG 的内部状态。不过,我会在这样做之前setSeed调用其中一种方法,否则您可以替换状态而不是向其添加熵。nextXxx


请注意,可以扩展SecureRandom; 对于大多数其他密码学相关类来说,情况并非如此。实施 CSPRNG 并非胆小;由于 SHA1PRNG,您创建更好的 CSPRNG 的机会很小(Apache 实现有一些非常可怕的属性,仅举一次尝试)。

于 2017-02-26T00:46:47.653 回答