赞
踩
一、前言
在一次项目的安全测试源代码扫描中,报由random()实施的随机数生成器不能抵挡加密攻击。其中报漏洞的源代码如下:
int number = (int) ((Math.random() * 9 + 1) * Math.pow(10, 6 -1));
String numStr= String.valueOf(number);
其中的报漏洞的解释是这样说的,在对安全性要求较高的环境中,使用能够生成可预测值的函数作为伪随机数据源,会产生Insecure Randomness(不安全随机性)错误。电脑是一种具有确定性的机器,因此不可能产生真正的随机性,伪随机数生成器(PRNG)近似于随机算法,始于一个能计算后续数值的种子。PRNG 包括两种类型: 统计学的 PRNG 和密码学的 PRNG。 统计学的 PRNG 提供很多有用的统计属性, 但其输出结果很容易预测, 因此容易复制数值流。 在安全性所依赖的生成值不可预测的情况下, 这种类型并不适用。 密码学的 PRNG 生成的输出结果较难预测, 可解决这一问题。 为保证值的加密安全性, 必须使攻击者根本无法、 或几乎不可能鉴别生成的随机值和真正的随机值。 通常情况下, 如果并未声明 PRNG 算法带有加密保护, 那么它很可能就是统计学的 PRNG, 因此不应在对安全性要求较高的环境中使用, 否则会导致严重的漏洞(如易于猜测的密码、 可预测的加密密钥、 Session Hijacking 和 DNS Spoofing) 。
示例: 下面的代码可利用统计学的 PRNG 为购买产品后仍在有效期内的收据创建一个 URL。
String GenerateReceiptURL(String baseUrl) {
Random ranGen= newRandom();
ranGen.setSeed((newDate()).getTime());return (baseUrl + ranGen.nextInt(400000000) + ".html");
}
这段代码使用 Random.nextInt() 函数为它生成的收据页面生成“唯一”的标识符。 由于 Random.nextInt() 是统计学的 PRNG, 攻击者很容易猜到其生成的字符
串。 尽管收据系统的底层设计并不完善, 但若使用不会生成可预测收据标识符的随机数生成器(如密码学的 PRNG),就会更安全些。
二、解决方案
当不可预测性至关重要时, 如大多数对安全性要求较高的环境都采用随机性, 这时可以使用密码学的 PRNG。 不管选择了哪一种 PRNG, 都要始终使用带有充足熵的数值作为该算
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。