免责声明:请在访问相关连接时替换HXXP为HTTP,仅供安全研究与教学实例,风险自负!
Android 4.4之前版本的Java加密架构(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom实现存在安全漏洞,具体位于classlib/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java文件的engineNextBytes函数里。当用户没有提供用于产生随机数的种子时,程序不能正确调整偏移量,导致伪随机数生成器(PRNG)生成随机序列的过程可被预测。漏洞文件参见文后链接1。
2013年8月份的比特币应用被攻击也与这个漏洞相关。比特币应用里使用了ECDSA算法,这个算法需要一个随机数来生成签名,然而生成随机数的算法存在本文提到的安全漏洞。同时这个ECDSA算法本身也有漏洞,在这个事件之前索尼的PlayStation 3 master key事件也是利用的这个算法漏洞。
本文主要介绍SecureRandom漏洞,关于ECDSA算法漏洞读者可以自行阅读下面的资料:
hxxp://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Security
hxxp://tools.ietf.org/html/rfc6979
Google group上关于PlayStation 3 master key事件如何利用ECDSA算法漏洞获取私钥的讨论:
hxxps://groups.google.com/forum/?fromgroups=#!topic/sci.crypt/3isJl28Slrw
在java里,随机数是通过一个初始化种子来生成的。两个PRNG实例,如果使用相同的种子来初始化,就会得到相同的随机序列。Java Cryptography Architecture里提供了几个加密强度更大的PRNGs,这些PRNGs都是通过SecureRandom接口实现的。
java.security.SecureRandom这个类本身并没有实现伪随机数生成器,而是使用了其他类里的实现。因此SecureRandom生成的随机数的随机性、安全性和性能取决于算法和熵源的选择。
小编推荐阅读