文章目录
背景
作为伪随机数生成方法Math.random(),存在一些安全隐患,如果触碰到代码扫描这关,估计就得被打回来重新寻找新的生成随机数的方法了。。。。
替换random的方案
最重要的一点,就是可以透过代码扫描
方案一:
// 返回a-b之间任意的整数 这里需要注意 seed需要具备全局变量的性质
Math.seed = 6;
Math.seededRandom = function(max, min)
{
max = max || 1;
min = min || 0;
// 根据数值进行随机值计算
Math.seed = (Math.seed * 9301 + 49297) % 233280;
var rnd = Math.seed / 233280;
return min + rnd * (max - min);
}
方案二, 使用crypto(
参考文章
)
function randrange(min,max){
var range = max - min;
if(range<= 0){
throw new Error('max必须大于min');
}
var requestBytes = Math.ceil(Math.log2(range)/ 8);
if(!requestBytes){//无需随机性
return min;
}
var maxNum = Math.pow(256,requestBytes);
var ar = new Uint8Array(requestBytes);
while(true){
window.crypto.getRandomValues(ar);
var val = 0;
for(var i = 0; i< requestBytes; i ++){
val =(val<< 8)+ ar [i];
}
if(val < maxNum-maxNum%range){
return min +(val%range);
}
}
}
版权声明:本文为qq_36579455原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。