Math.random()是否加密安全?

gre*_*rep 45 javascript random cryptography

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

random我可以使用多少位?

Teo*_*gul 39

不; JavaScript的Math.random()功能不是加密安全的随机数生成器.你最好使用JavaScript Crypto Library的Fortuna实现,它是一个强大的伪随机数生成器(看看src/js/Clipperz/Crypto/PRNG.js),或Web Crypto API forgetRandomValues

  • 但是,作为附录,您不需要加密安全的 PRNG 来生成盐。盐只需要是唯一的,并且是非确定性生成的。 (3认同)

Bru*_*hée 17

它根本不安全,在某些情况下是如此可预测,您可以重建PRNG的内部状态,扣除种子,因此可以使用它来跟踪网站上的人,即使他们没有使用cookie,隐藏在洋葱路由后面等...


Kev*_*son 8

截至2013年3月,window.crypto.getRandomValues是一种"实验性技术",可用于Chrome 11和Firefox 21,可让您获得加密随机值.另外,请参阅最新的W3C Web Cryptography API草案中的getRandomValues.

描述:

如果您提供基于整数的TypedArray(即Int8Array, Uint8Array,Int16Array,Uint16Array,Int32Array,或Uint32Array),该函数将填充加密的随机数的数组.浏览器应该使用强(伪)随机数生成器.如果请求的长度大于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]);
}
Run Code Online (Sandbox Code Playgroud)

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

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


Dan*_*mer 5

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

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

即使您在 JavaScript 中包含良好的 PRNG,您的服务器也无法知道来自客户端的请求是否源自未修改的脚本。如果该号码进入您的数据库和/或用作加密工具,那么信任来自客户端的数据根本不是一个好主意。这不仅适用于有效性(您确实验证了来自客户端的所有数据,不是吗?),而且适用于随机性等一般属性。