【发布时间】:2014-11-07 03:43:06
【问题描述】:
我已经读过,一般来说,some implementations of SecureRandom may produce true random numbers。
特别是Android docs 说
此类的实例将使用内部熵源生成初始种子,例如
/dev/urandom
但这是否意味着它会产生真正的随机数(即,而不是伪随机数)?
如果我以这种方式在 Android 中使用SecureRandom...
SecureRandom sr = new SecureRandom();
...当我调用sr.nextBoolean() 时,我会得到真正随机的输出吗?
或者,如果我每次都通过这样做来获得输出,那么输出是否可能更多(或更少?)随机:
new SecureRandom().nextBoolean()?
【问题讨论】:
-
这不是必须正确的,因为某些Android设备没有硬件来生成正确的随机数。至于带有该硬件的设备是否会使用它,我不这么认为,尽管 Linux 内核可能会加载一个从此类硬件获取真正随机数的模块。
-
AFAIK 所有的实现都使用不同的形式或算法散列。虽然具有良好的数学特性,但它们并不是真正随机的。
-
来自Android Developer's Blog:“我们现在已经确定,使用 Java 密码体系结构 (JCA) 进行密钥生成、签名或随机数生成的应用程序可能无法在 Android 上接收加密强值由于底层 PRNG 初始化不当导致的设备..."。之后,我相信 AOSP 会切换到 OpenSSL 的生成器。更改发生在Jelly Bean。
-
@ban-geoengineering - 我有代码使用 JNI 读取 Android 的传感器,然后播种随机数生成器(如 OpenSSL 或 Crypto++)。您可以使用它来做同样的事情,或者使用它来播种 Java HMAC/SHA-1 生成器。 “肉和土豆”源文件位于 Android/Crypto++ PRNG auto-seeded from sensors (by JWW) 的 Pastebin 上。我希望尽快将Eclipse项目上传到Crypto++ wiki(由于配置更改,wiki目前遇到问题)。
-
等一下。 /dev/urandom 仅用于生成初始种子。在那之后,一切都是算法。 SecureRandom 需要“提供加密强随机数生成器 (RNG)”。
标签: java android random secure-random