Math.random()伪随机数漏洞修复方案

Math.random()伪随机数漏洞修复方案
在对安全性要求较高的环境中,使用能够生成可预测值的函数作为随机数据源,会产生
Insecure Randomness 错误。
电脑是一种具有确定性的机器,因此不可能产生真正的随机性。伪随机数生成器 (PRNG)
近似于随机算法,始于一个能计算后续数值的种子。
PRNG 包括两种类型:统计学的 PRNG 和密码学的 PRNG。统计学的 PRNG 提供很多
有用的统计属性,但其输出结果很容易预测,因此容易复制数值流。在安全性所依赖的生
成值不可预测的情况下,这种类型并不适用。密码学的 PRNG 生成的输出结果较难预测
,可解决这一问题。为保证值的加密安全性,必须使攻击者根本无法、或几乎不可能鉴别
生成的随机值和真正的随机值。通常情况下,如果并未声明 PRNG 算法带有加密保护,那
么它很可能就是统计学的 PRNG,因此不应在对安全性要求较高的环境中使用,否则会导
致严重的漏洞(如易于猜测的密码、可预测的加密密钥、Session Hijacking 和 DNS
Spoofing)。
Math.random() 是统计学的 PRNG,攻击者很容易猜到其生成的字符
串。尽管收据系统的底层设计并不完善,但若使用不会生成可预测收据标识符的随机数生
成器(如密码学的 PRNG),就会更安全些。
伪随机数生成器主要用于快速计算出看起来随机的值。不过并不适合用于加密计算。为解决这个问
题,密码学安全伪随机数生成器(CSPRNG,Cryptographically Secure PseudoRandom Number Generator)
额外增加了一个熵作为输入,例如测试硬件时间或其他无法预计行为的系统特性。这样一来,计算速度明显比常规 PRNG 慢很多,但 CSPRNG生成的值就很难预测,可以用于加密了。
Web Cryptography API引入了 CSPRNG,这个 CSPRNG可以通过 crypto.getRandomValues() 在全
局 Crypto 对象上访问。与 Math.random() 返回一个介于 0和 1之间的浮点数不同, getRandomValues()
会把随机值写入作为参数传给它的定型数组。定型数组的类不重要,因为底层缓冲区会被随机的二进制
位填充。

function randomFloat() {
// 生成 32 位随机值
const fooArray = new Uint32Array(1);
// 最大值是 2^32 –1
const maxUint32 = 0xFFFFFFFF;
// 用最大可能的值来除
return crypto.getRandomValues(fooArray)[0] / maxUint32;
}
console.log(randomFloat());

利用上述代码替换掉Math.random即可解决此问题,部分漏洞扫描会扫描Math.random代码块,所以不建议将randomFloat赋值给Math.random,而应该新定义一个变量使用。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值