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
Bru*_*hée 17
它根本不安全,在某些情况下是如此可预测,您可以重建PRNG的内部状态,扣除种子,因此可以使用它来跟踪网站上的人,即使他们没有使用cookie,隐藏在洋葱路由后面等...
http://landing2.trusteer.com/sites/default/files/Temporary_User_Tracking_in_Major_Browsers.pdf 2008年论文揭露用户跟踪浏览器弱PRNG的可能性
http://dl.packetstormsecurity.net/papers/general/Google_Chrome_3.0_Beta_Math.random_vulnerability.pdf 一个更晚的(2009)Chrome漏洞,因为这个问题已经众所周知
截至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,Firefox和Safari错误报告.
因为您无法知道浏览器的确切实现(除了像您的企业内部网这样的封闭用户组),我通常认为 RNG 较弱。
即使您可以识别浏览器,您也不知道浏览器本身或任何其他浏览器的代理 ID 是否被操纵。如果可以的话,您应该在服务器上生成该号码。
即使您在 JavaScript 中包含良好的 PRNG,您的服务器也无法知道来自客户端的请求是否源自未修改的脚本。如果该号码进入您的数据库和/或用作加密工具,那么信任来自客户端的数据根本不是一个好主意。这不仅适用于有效性(您确实验证了来自客户端的所有数据,不是吗?),而且适用于随机性等一般属性。
| 归档时间: |
|
| 查看次数: |
24492 次 |
| 最近记录: |