Java:使用 DRBG SecureRandom 时如何设置随机数?

标签 java random cryptography secure-random

Java 9 引入了一种名为 DRBG 的新 SecureRandom。我想用它来确定性地生成随机数。问题是它在内部使用一个随机数,它总是在变化,所以我不会为相同的种子得到相同的数字。它确实有一个内部选项来设置那个随机数,但我找不到任何可以实现它的公共(public)方法。我该如何更改该随机数?

最佳答案

SecureRandom 类仍然声明:

Additionally, SecureRandom must produce non-deterministic output.

虽然列出的 DRBG 方案是确定性的,但它们仍将由运行时环境播种,运行时环境通常从操作系统中检索熵。


在这方面,“DRBG”的含义可能有些混淆。尽管底层算法本质上是确定性的,但这仅意味着它依赖于种子中的熵来生成比特流。这些随机位在计算上与随机无法区分,即使它们只包含有限数量的熵。如果对手可以猜出种子,那么整个流就会为人所知。但如果种子包含足够的熵,那么这在实践中是不可能的。

“DRBG”只是指一种预先配置且定义明确的 NIST 标准化算法(可以在 this question 的答案中看到)。因此它不同于“SHA1PRNG”; “SHA1PRNG”是 Sun 的专有算法,完全未指定,其他实现(例如 Android 中的实现)既不同又不安全。 Java 的早期版本确实允许您从“SHA1DRBG”中确定性地生成安全的随机值,您在检索它的任何输出之前对其进行播种。


可以自己创建一个 SecureRandomSpi 确定性的,但是这样您就违反了 SecureRandomSpi 的约定.如果这样做,您当然必须实现提供程序。

实现 SecureRandomSpi 将是正确的方法,但请注意,您实际上可以从 SecureRandom 继承,所以有一个捷径,如果有点 hack。

要获得快速、确定性的“随机”实现,您可能需要在底层使用流密码。这比 DRBG 更有效,而且它没有功能,例如重新播种,您绝对可以不这样做。可能您还需要实现 KDF 来生成 DRBG 所需的 key 。

如果您采用这种方式,请明确指定您的协议(protocol),否则开发人员将不得不对您的代码进行逆向工程才能获得所使用的算法。

关于Java:使用 DRBG SecureRandom 时如何设置随机数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50907444/

相关文章:

c - 为结构成员生成随机字符串

java - MapMaker 设计模式?

java - 即使在安装 Bouncy CaSTLe 提供程序后,TLSv1.2 SSLContext 也不可用错误

java - 如何生成随机字符串?

c - Rand 函数在 C 中无法正常工作

javascript - 在 C# 中重现 JS PBKDF2 哈希

c# - 带有 Rfc2898DeriveBytes 的 PBKDF2 为相同的输入产生不同的输出?

java - HMC SHA1 哈希 - Java 生成与 C# 不同的哈希输出

java - component.get MouseMotionListener 返回多个

java - 步骤 : JmsOutput Why? 中的愤怒 org.pentaho.di.core.exception.KettleMissingPluginsException