前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么不使用 Math.random() ?!

为什么不使用 Math.random() ?!

原创
作者头像
888888888
发布2022-01-24 11:50:51
1.3K0
发布2022-01-24 11:50:51
举报
文章被收录于专栏:FErFEr

有什么风险?

JavaScript Math.random() 函数旨在返回一个介于 0 和 1 之间的浮点值。众所周知(或至少应该如此)输出在密码学上是不安全的。

使用伪随机数生成器 (PRNG) 是不安全的。 例如,过去曾有以下漏洞:

Why? COZ:

当程序在需要不可预测性的上下文中生成可预测的值时,攻击者可能会猜测将要生成的下一个值,并使用该猜测来冒充另一个用户或访问敏感信息。

由于 Math.random() 函数依赖于弱伪随机数生成器,因此此函数不应用于安全关键型应用程序或保护型敏感数据。 在这种情况下,应该使用强加密伪随机数生成器 (CSPRNG)。

你在使用这个风险吗?

不妨问问自己

  • 使用生成值的代码要求它是不可预测的。 对于所有加密机制或对密码等秘密值进行散列处理时都是这种情况。
  • 您使用的函数会生成一个可以预测的值(伪随机)。
  • 生成的值被多次使用。
  • 攻击者可以访问生成的值。

如果您对以上任一问题的回答是肯定的,则存在风险。

密码学强生成方法

Crypto.getRandomValues()

不妨动动手在 Chrome 中测试以下代码以获取随机字节:

代码语言:javascript
复制
(function(){
  var buf = new Uint8Array(1);
  window.crypto.getRandomValues(buf);
  alert(buf[0]);
})();

总结

  • 当预期值不会影响应用程序时,您可以使用 Math.random()。
  • web很难检测 Math.random() 是否为 应用在强密码学还是一个弱 RNG。
  • 必要的时候,需要时使用 Crypto.getRandomValues() 方法。

来源

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 有什么风险?
  • 你在使用这个风险吗?
    • 不妨问问自己
    • 密码学强生成方法
    • Crypto.getRandomValues()
    • 总结
    • 来源
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档