JavaScript中的SecureRandom?

问题描述 投票:6回答:2

JavaScript中是否有类似SecureRandom.hex()的(红宝石)函数会为我生成随机哈希?

javascript ruby random hash
2个回答
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;
}

2
投票

使用以下关键字,我被认为是搜索引擎结果最高的问题:

  • 安全范围js
  • securerandom js

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

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

...在密码学上强...使用带有足够熵的值播种的伪随机数生成器...适用于密码用法。

因此,我们有:

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()

快乐编码!

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

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([]);
}

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

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来替代即插即用都适合您的应用程序,或者目标受众纯粹是作为实施者的一项学术练习。请务必先与您的建筑师联系!当然,请在此处许可MIT:)

© www.soinside.com 2019 - 2024. All rights reserved.