我已经读过,一般来说,some implementations of SecureRandom may produce true random numbers。
特别是,Android docs说
此类的实例将使用内部熵源生成初始种子,例如
/dev/urandom
但这是否意味着它将产生真正的随机数(即,而不是伪随机数)?
如果我以这种方式在Android中使用SecureRandom
......
SecureRandom sr = new SecureRandom();
...每当我打电话给sr.nextBoolean()
时,我会得到一个真正的随机输出吗?
或者,如果我每次都这样做,输出可能更多(或更少?)随机:new SecureRandom().nextBoolean()
?
“真实”和“伪随机”随机数对不同的人来说意味着很多不同的东西。最好避免这些。
/dev/urandom
得到了一个糟糕的代表,因为人们不理解它与/dev/random
之间的差异(很多,差异远小于你的预期)。
如果你问/dev/urandom
播种是否会影响SecureRandom
用于加密目的的适应性,答案是响亮的“不”。
如果你有一些时间,你可能想要阅读my essay关于整个问题。
关键的答案是,/dev/urandom
,defined by the linux kernel,保证不会阻止。重点在于在生成足够的熵的同时不停止用户。如果android文档说他们正在使用/dev/urandom
进行初始化,并且内核中的熵不足以提供随机数,则内核将回退到伪随机算法。
根据内核文档,/dev/urandom
被认为足以用于几乎所有目的,除了“长期[加密]密钥”。鉴于您的预期用途的描述,我怀疑android SecureRandom
将被证明是足够随机的。
(SecureRandom)符合FIPS 140-2中规定的统计随机数生成器测试,加密模块的安全要求,第4.9.1节
但是,同样的警告适用于Android和Java:
许多SecureRandom实现采用伪随机数生成器(PRNG)的形式,这意味着它们使用确定性算法从真正的随机种子生成伪随机序列。其他实现可以产生真正的随机数,而其他实现可以使用两种技术的组合。
因此,简短的回答是:它取决于实施,但如果您对FIPS 140-2没问题,那么SecureRandom在法律上足以满足您的需求。