Java9引入了一种名为DRBG的新SecureRandom。我想用它来确定地生成随机数。问题是,它在内部使用的是一个nonce,它总是会改变,所以对于相同的种子,我不会得到相同的数字。它在内部有一个选项来设置“现在”,但是我找不到任何公共方法可以实现这一点。我怎么才能改变现在呢?
发布于 2019-10-09 11:21:03
SecureRandom类仍然声明:
此外,
SecureRandom必须产生不确定的输出.
虽然列出的DRBG方案是确定性的,但它们仍然会被运行时环境所播种,运行时环境通常会从操作系统中检索熵。
在这方面,可能有一些混淆"DRBG“的含义。虽然底层算法在本质上是确定性的,但这仅仅意味着它依赖于种子中的熵来生成一个比特流。这些随机比特在计算上与随机没有区别,尽管它们只包含有限的熵。如果对手能猜到种子,那么整个溪流就会被知道。但是如果种子包含足够的熵,那么在实践中这是不可能的。
"DRBG“只是指预先配置和定义良好的NIST标准化算法(它可以在this question的答案中看到)。与"SHA1PRNG“不同的是,"SHA1PRNG”是Sun的专有算法,完全不指定,其他实现--比如Android的实现--既不同又不安全。早期版本的Java确实允许您在检索任何输出之前,从"SHA1DRBG“中确定地生成安全的随机值。
您可以自己创建一个确定性的SecureRandomSpi,但是这样就违反了SecureRandomSpi的约定。如果你这样做的话,你当然需要实现一个提供者。
实现SecureRandomSpi将是正确的方法,但请注意,您实际上可以从SecureRandom继承,因此有一个快捷方式,如果有点麻烦的话。
要具有快速、确定性的“随机”实现,您可能需要在下面使用流密码。这比DRBG更有效,而且它没有用于例如重新播种的功能,这是您绝对可以避免的。可能还会实现一个KDF来生成DRBG所需的密钥。
如果您这样做,请明确指定您的协议,否则开发人员将不得不反向工程您的代码只是为了获得所使用的算法。
https://stackoverflow.com/questions/50907444
复制相似问题