JavaScript中的SecureRandom?

时间:2011-05-09 06:24:27

标签: javascript ruby random hash

JavaScript中是否有SecureRandom.hex() - like(ruby)函数为我生成随机哈希?

2 个答案:

答案 0 :(得分:3)

JS中没有这样的辅助函数。您可以使用以下方法生成相当随机的哈希:

function hex(n){
 n = n || 16;
 var result = '';
 while (n--){
  result += Math.floor(Math.random()*16).toString(16).toUpperCase();
 }
 return result;
}

你可以修改它以形成一个guid:

function generateGuid(){
 var result = '', n=0;
 while (n<32){
  result += (~[8,12,16,20].indexOf(n++) ? '-': '') +    
            Math.floor(Math.random()*16).toString(16).toUpperCase();
 }
 return result;
}

答案 1 :(得分:3)

使用以下关键字使我成为搜索引擎最佳搜索结果:

  • 安全范围js
  • 安全随机js

因此,我认为最好用今天(2019年)提供的有效答案来更新此帖子:

下面的代码段使用Crypto.getRandomValues()来获取据说是的随机值,

  

...具有强大的密码功能...使用伪随机数生成器播种,该值填充了具有足够熵的值...适用于密码用法。

因此,我们有:

var N = 32;
var rng = window.crypto || window.msCrypto;
var rawBytes = Array
              .from(rng.getRandomValues(new Uint8Array(N)))
              .map(c => String.fromCharCode(c))
              .join([]);

来源:JavaScript-based Password Generator

现在,下面是一个有趣的小十六进制编码器,我使用一些Array函数将其作为单线烹饪成循环:

function hexEncode(s) {
  return s.split('').map(c => (c < String.fromCharCode(16) ? '0' : '') + c.charCodeAt(0).toString(16)).join([]);
}

最后,如果要将以上两者结合起来以生成随机散列,则可以换掉.map()函数并对其进行相应包装,如下所示:

function secureRandomHash(N) {
  N = N || 32; // Coalesce if size parameter N is left undefined

  // TODO: Consider refactoring with lazy-loaded function
  // to set preferred RNG provider, else throw an error here
  // to generate noise that no secure RNG is available for
  // this application.
  var rng = window.crypto || window.msCrypto;

  return Array
           .from(rng.getRandomValues(new Uint8Array(N)))
           .map(c => (c < 16 ? '0' : '') + c.toString(16)).join([]);
}

编码愉快!

编辑:事实证明,我最终在自己的项目中需要此功能,该项目还实现了上一个示例中的建议TODO(延迟加载),因此我们开始:

Math.secureRandom = function() {
  var rng = window.crypto || window.msCrypto;
  if (rng === undefined)
    throw 'No suitable RNG found';

  // Lazy-load this if- branch
  Math.secureRandom = function() {
    // More secure implementation of Math.random (https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#Examples)
    return rng.getRandomValues(new Uint32Array(1))[0] / 4294967296;
  };

  return Math.secureRandom();
}

或者如果您真的很冒险...

// Auto-upgrade Math.random with a more secure implementation only if crypto is available
(function() {
  var rng = window.crypto || window.msCrypto;
  if (rng === undefined)
    return;

  // Source: https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#Examples
  Math.random = function() {
    return rng.getRandomValues(new Uint32Array(1))[0] / 4294967296;
  };
})();

console.log(Math.random());

扩展(Math或覆盖Math.random()来代替即插即用是适合您的应用程序还是目标受众纯粹是实施者的一项学术练习。请务必先与您的建筑师联系!当然,请在这里获得MIT许可:)