问题描述
|
在不同浏览器中的Javascriptѭ0中使用的算法有多好?可以使用它生成盐和一次性密码吗?
我可以使用一个ѭ1中的多少位?
解决方法
不; JavaScript的“ 0”函数不是加密安全的随机数生成器。最好使用JavaScript加密库的Fortuna实现,该实现是一个强大的伪随机数生成器(请参阅ѭ3),或Web加密API的
getRandomValues
。
以下是详细说明:在各种浏览器中javascript的随机实现的可信度如何?
这是如何生成一个好的加密级随机数:在javascript中保护随机数?
,它根本不安全,在某些情况下是如此可预测的,您可以重建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密码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]);
}
此外,还可以回答JavaScript的Math.random有多随机?指的是主要浏览器中的临时用户跟踪以及2008年以来的跨域信息泄漏和攻击,其中讨论了JavaScript Math.random()函数如何泄漏信息。
更新:有关当前浏览器支持状态,请查看Modern.IE Web加密API部分,该部分还链接到Chrome,Firefox和Safari错误报告。
,因为您不知道浏览器的确切实现方式(除了像企业Intranet这样的封闭用户组),所以我通常认为RNG较弱。
即使您可以识别浏览器,也不知道浏览器本身或任何其他浏览器的代理ID是否受到操纵。如果可以,您应该在服务器上生成该号码。
即使在JavaScript中包含良好的PRNG,服务器也无法知道来自客户端的请求是否源自未修改的脚本。如果该号码进入您的数据库和/或用作加密工具,则完全不信任来自客户端的数据是个好主意。不仅对于有效性(您确实要验证来自客户端的所有数据,对吗?),而且对于诸如随机性的一般属性,也是如此。
,“ 0”不是加密安全的。同样,Veracode会使用
CWE-331(熵不足)
我们可以利用SecureRandom来实现类似的功能。
new SecureRandom().nextDouble();