SecureRandom的Android实现是否会生成真正的随机数?

ban*_*ing 14 java random android secure-random

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

特别是,Android文档

此类的实例将使用内部熵源生成初始种子,例如 /dev/urandom

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

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

SecureRandom sr = new SecureRandom();
Run Code Online (Sandbox Code Playgroud)

...每当我打电话时,我会得到一个真正的随机输出sr.nextBoolean()吗?

或者,如果我每次都通过这样做获得输出,那么输出可能更多(或更少?)随机: new SecureRandom().nextBoolean()

Tho*_*mas 5

“真”和“伪随机”随机数对不同的人意味着很多不同的东西。最好避免这些。

/dev/urandom得到了一个糟糕的代表,因为人们不明白它和/dev/random(比你预期的要少得多)之间的区别。

如果您问播种 by 是否/dev/urandom会损害将SecureRandom其用于加密目的的适用性,答案是响亮的“否”。

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


cas*_*key 0

关键的答案是/dev/urandom,正如Linux 内核所定义的那样,保证不会阻塞。重点是在生成足够的熵的同时不要让用户停顿。如果 android 文档说他们正在使用/dev/urandom初始化,并且内核中没有足够的熵来提供随机数,则内核将回退到伪随机算法。

根据内核文档,/dev/urandom除了“长期[加密]密钥”之外,它被认为足以满足几乎所有目的。鉴于您的预期用途的描述,我怀疑 androidSecureRandom将证明对于您的目的来说足够随机。