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

问题描述 投票:2回答:1

Java 9引入了一个称为DRBG的新SecureRandom。我想用它来确定性地生成随机数。问题在于它在内部使用一个随时更改的随机数,因此对于相同的种子,我不会得到相同的数字。它的内部确实有一个选项可以设置该随机数,但是我找不到任何可以完成该操作的公共方法。如何更改该随机数?

java random cryptography secure-random
1个回答
1
投票

SecureRandom类仍声明:

此外,SecureRandom必须产生不确定的输出。

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


在这方面,“ DRBG”的含义可能有些混乱。尽管底层算法本质上是确定性的,但这仅意味着它依赖于种子中的熵来生成位流。尽管这些随机位仅包含有限数量的熵,但它们与随机是无法区分的。如果对手可以猜到种子,那么整个流就可以知道了。但是,如果种子包含足够的熵,那么实际上是不可能的。“ DRBG”只是指一种预先配置且定义良好的NIST标准化算法(可以在this question的答案中看到)。因此,它与“ SHA1PRNG”不同。 “ SHA1PRNG”是Sun专有的算法,完全没有指定。 Java的早期版本的确允许您从种子中的“ [SHA1DRBG””中确定性地生成安全随机值。


可以

自己创建一个确定性的SecureRandomSpi,但随后您将违反SecureRandomSpi的合同。如果这样做的话,您当然必须实现一个提供程序。

实现SecureRandomSpi是正确的方法,但请注意,您实际上可以从SecureRandom继承,因此,如果有一点黑话,那是捷径。

要获得快速,确定的“随机”实现,您可能希望在其下使用流密码。这比DRBG更有效,而且它没有用于reseeding您绝对可以不用。可能还需要实现一个KDF来生成DRBG所需的密钥。

如果您采用这种方式,请先清楚地指定您的协议,否则开发人员将不得不对您的代码进行反向工程,以获取所使用的算法。

© www.soinside.com 2019 - 2024. All rights reserved.