- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
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/
较新的 Intel 处理器包括一个 DRBG,它可以生成可以使用 RDRAND 指令读取的随机数。它涉及从硬件熵源生成的 256 位种子 S,该熵源依赖于亚稳态振荡器中的噪声。用于得出数字的算法实际上
Java 9 (JSR 379) introduces the NIST DRBG's如 JEP 273 中所述.但是,NIST 文档 SP 800-90Ar1 (NIST Special Publi
Java 9 引入了一种名为 DRBG 的新 SecureRandom。我想用它来确定性地生成随机数。问题是它在内部使用一个随机数,它总是在变化,所以我不会为相同的种子得到相同的数字。它确实有一个内部
我正在尝试将 OpenSSL FIPS 对象模块 v2.0 与基本 OpenSSL 库 (1.0.1c) 结合使用,以使我的应用程序符合 FIPS 140-2 要求。问题是我无法弄清楚如何使用 FIP
我是一名优秀的程序员,十分优秀!