Math.random()是密码保护的吗?

在不同的浏览器中使用JavaScript Math.random()algorithm有多好? 可以用它来生成盐和一次性密码吗?

从一个random我可以使用多less位?

不; JavaScript的Math.random()函数不是一个密码安全的随机数生成器。 您最好使用JavaScript Crypto Library的Fortuna实现,它是一个强大的伪随机数生成器(查看src/js/Clipperz/Crypto/PRNG.js ),或者用于getRandomValues的Web Crypto API

  • 这里有一个详细的解释: 在各种浏览器中,javascript的随机实现有多值得信赖?
  • 这里是如何生成一个好的encryption级随机数: 在JavaScript中安全的随机数字?

这是不安全的,在某些情况下是可以预测的,你可以重buildPRNG的内部状态,扣除种子,从而可以使用它来跟踪跨网站的人,即使他们不使用cookies,躲在洋葱路由等…

截至2013年3月, window.crypto.getRandomValues是自Chrome 11和Firefox 21起可用的“实验技术”,可让您获得encryption随机值。 另请参阅最新的W3C Web Cryptography API草稿中的getRandomValues 。

描述:

如果您提供基于整数的TypedArray (即Int8ArrayUint8ArrayInt16ArrayUint16ArrayInt32ArrayUint32Array ),函数将使用encryption随机数填充数组。 浏览器应该使用强大的(伪)随机数发生器。 如果请求的长度大于65536字节,该方法将引发QuotaExceededError。

例:

 var array = new Uint32Array(10); window.crypto.getRandomValues(array); console.log("Your lucky numbers:"); for (var i = 0; i < array.length; i++) { console.log(array[i]); } 

此外, JavaScript的Math.random是如何随机的答案? 指主要浏览器中的临时用户跟踪以及 2008年的跨域信息泄漏和攻击 ,其中讨论了JavaScript Math.random()函数如何泄漏信息。

更新:有关当前的浏览器支持状态,请查看Modern.IE Web Crypto API部分,该部分也链接到Chrome , Firefox和Safari错误报告。

因为你无法知道浏览器的确切实现(除了像你的企业内部网那样封闭的用户组),我通常会认为RNG很弱。

即使您可以识别浏览器,也不知道浏览器本身或任何其他浏览器的代理ID是否被操纵。 如果你可以的话,你应该在服务器上生成号码。

即使您在JavaScript中包含了一个好的PRNG,您的服务器也无法知道客户端的请求是否来自未经修改的脚本。 如果数字进入您的数据库和/或被用作encryption工具,根本不信任来自客户端的数据。 这不仅是有效的( 你确实来自客户的所有数据,不是吗? ),而且也是一般的属性,如随机性。

Math.random()不是encryption安全的。 另外Veracode将指出这种情况

CWE-331(熵不足)

我们可以利用SecureRandom来实现类似的function。

 new SecureRandom().nextDouble();