Laz*_*vic 7 java random cryptography secure-random
Java 9引入了一个新的名为DRBG的SecureRandom。我想用它来确定性地生成随机数。问题在于它在内部使用一个随时更改的随机数,因此对于相同的种子,我不会得到相同的数字。它的内部确实有一个选项可以设置该随机数,但是我找不到任何可以完成该操作的公共方法。如何更改该随机数?
该SecureRandom班还指出:
此外,
SecureRandom必须产生不确定的输出。
尽管列出的DRBG方案是确定性的,但它们仍将由运行时环境播种,该运行时环境通常从操作系统中检索熵。
在这方面,“ DRBG”的含义可能有些混乱。尽管底层算法本质上是确定性的,但这仅意味着它依赖于种子中的熵来生成位流。即使这些随机位仅包含有限数量的熵,它们在计算上与随机也无法区分。如果对手可以猜到种子,那么整个流就可以知道了。但是,如果种子包含足够的熵,那么实际上是不可能的。
“ DRBG”仅指一种预先配置且定义明确的NIST标准化算法(可以在该问题的答案中看到)。因此,它与“ SHA1PRNG”不同。“ SHA1PRNG”是Sun专有的算法,完全没有指定,其他实现(例如Android中的实现)既不同又不安全。Java的早期版本确实允许您从种子中的“ SHA1DRBG”确定性地生成安全随机值,然后再从中检索任何输出。
你可以自己创建一个SecureRandomSpi即是确定的,但你违反了合同SecureRandomSpi。如果这样做,您当然必须实现提供程序。
实现SecureRandomSpi是实现此目标的正确方法,但是请注意,实际上您可以从中继承,SecureRandom因此有一点捷径,如果有一点黑话的话。
为了具有快速,确定性的“随机”实现,您可能需要在下面使用流密码。这比DRBG更有效,并且它不具有例如重新播种的功能,而您绝对可以没有这些功能。可能还需要实现一个KDF来生成DRBG所需的密钥。
如果您采用这种方式,那么请先明确指定协议,否则开发人员将不得不对您的代码进行反向工程,以获取所使用的算法。