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

时间:2014-09-12 21:28:54

标签: java android random secure-random

我通常已经阅读some implementations of SecureRandom may produce true random numbers

特别是,Android docs

  

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

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

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

SecureRandom sr = new SecureRandom();

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

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

3 个答案:

答案 0 :(得分:4)

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

/dev/urandom得到了一个糟糕的代表,因为人们不理解它与/dev/random之间的差异(很多,差异远小于你的预期)。

如果您要问/dev/urandom播种是否可能会影响SecureRandom将其用于加密目的的适合度,那么答案就是响亮的&#34; no&#34;。< / p>

如果您有一段时间,可能需要阅读有关整个问题的my essay

答案 1 :(得分:0)

关键答案是/dev/urandomdefined by the linux kernel,保证不会阻止。重点在于在生成足够的熵的同时不停止用户。如果android文档说他们正在使用/dev/urandom进行初始化,并且内核中的熵不足以提供随机数,则内核将回退到伪随机算法。

根据内核文档,/dev/urandom被认为足以满足几乎所有目的,除了&#34;长期存在的[加密]密钥&#34;。鉴于您的预期用途的描述,我怀疑android SecureRandom将被证明是足够随机的。

答案 2 :(得分:0)

根据Android Developer Docs

  

(SecureRandom)符合FIPS 140-2“加密模块的安全性要求”第4.9.1节中指定的统计随机数生成器测试

但是,同样的警告适用于Android和Java:

  

许多SecureRandom实现都是伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真实的随机种子生成伪随机序列。其他实现可能会产生真正的随机数,而其他实现可能会同时使用这两种技术。

因此,简短的答案是:它取决于实现,但是如果您对FIPS 140-2没问题,那么从法律上讲SecureRandom就足以满足您的目的。