关于java:SecureRandom的Android实现是否产生真正的随机数?

Does the Android implementation of SecureRandom produce true random numbers?

我已经阅读过,一般来说,SecureRandom的一些实现可能会产生真正的随机数。

特别是,Android文档说

instances of this class will generate an initial seed using an internal entropy source, such as /dev/urandom

但这是否意味着它将产生真正的随机数(即,而不是伪随机数)?

如果我用这种方式在Android中使用SecureRandom

…当我调用sr.nextBoolean()时,会得到一个真正的随机输出吗?

或者产出可能更多(或更少?)随机,如果我每次都通过这样做获得输出:江户十一〔二〕号?


"真"和"伪随机"随机数对不同的人来说意味着很多不同的事情。最好避免这些。

/dev/urandom的代表性很差,因为人们不理解它和/dev/random之间的区别(比你想象的要差很多,少得多)。

如果你问/dev/urandom的种子植入是否会损害SecureRandom用于加密目的的适合性,答案是响亮的"不"。

如果你有时间的话,你可能会想读我关于整个问题的文章。


根据Android开发者文档:

(SecureRandom) complies with the statistical random number generator tests specified in FIPS 140-2, Security Requirements for Cryptographic Modules, section 4.9.1

然而,同样的警告也适用于Android,就像Java一样:

Many SecureRandom implementations are in the form of a pseudo-random number generator (PRNG), which means they use a deterministic algorithm to produce a pseudo-random sequence from a true random seed. Other implementations may produce true random numbers, and yet others may use a combination of both techniques.

因此,简短的回答是:这取决于实现,但是如果您对FIPS 140-2满意,那么SecureRandom就足以满足您的目的了。


关键的答案是,由Linux内核定义的/dev/urandom保证不会阻塞。重点是在产生足够的熵的同时不拖延用户。如果Android文档说他们正在使用/dev/urandom进行初始化,并且内核中没有足够的熵来提供随机数,那么内核将返回到伪随机算法。

根据内核文档,除了"长寿命[加密]密钥",/dev/urandom几乎可以用于所有目的。考虑到您的预期用途,我怀疑Android SecureRandom将证明足够随机用于您的目的。