gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 02:19:39 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com