js–(crypto)自定义生成范围内随机数

  • Post author:
  • Post category:其他




背景

作为伪随机数生成方法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 版权协议,转载请附上原文出处链接和本声明。