JavaScript中是否有类似SecureRandom.hex()
的(红宝石)函数会为我生成随机哈希?
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;
}
使用以下关键字,我被认为是搜索引擎结果最高的问题:
因此,我认为最好用今天(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:)