假设我需要好的种子来在 Java 程序中初始化伪随机生成器 (PRNG),并且我无法访问任何硬件随机生成器。
如何在没有任何用户交互的情况下从 JVM 获取熵?
假设我需要好的种子来在 Java 程序中初始化伪随机生成器 (PRNG),并且我无法访问任何硬件随机生成器。
如何在没有任何用户交互的情况下从 JVM 获取熵?
您可以使用generateSeed(int)
或getSeed(int)
静态检索也用于SecureRandom
自身的种子输入。然后,您可以简单地使用该种子来播种您自己的 CSPRNG。
正如 8472 已经解释的那样,实际上几乎不需要这样做,但是如果您想生成自己的 CSPRNG(或 NIST 已知的 DRBG),那么没有什么能阻止您 - 只需在SecureRandom
实现的构造函数中提供种子即可。
您自己产生更好熵的机会很小。您可以使用标准System.nanoTime()
并使用命名错误的方法将其添加到 CSPRNG 的内部状态。不过,我会在这样做之前setSeed
调用其中一种方法,否则您可以替换状态而不是向其添加熵。nextXxx
请注意,可以扩展SecureRandom
; 对于大多数其他密码学相关类来说,情况并非如此。实施 CSPRNG 并非胆小;由于 SHA1PRNG,您创建更好的 CSPRNG 的机会很小(Apache 实现有一些非常可怕的属性,仅举一次尝试)。