我正在尝试在Node.js中生成准确6
个随机数字,这需要加密安全。这是我的代码:
var crypto = require('crypto');
crypto.randomBytes(2, function(err, buffer) {
console.log(parseInt(buffer.toString('hex'), 16));
});
问题是这个结果可能是4
或5
个数字,因为我们正在从十六进制转换为十进制。有没有办法保持加密安全功能randomBytes()
,但保证6位数的结果?
答案 0 :(得分:1)
2个字节的最大值为65535,因此如果只使用2个字节,则永远不会得到6个数字。
使用3个字节,然后使用substr
将其减少到6位:
var crypto = require('crypto');
crypto.randomBytes(3, function(err, buffer) {
console.log(parseInt(buffer.toString('hex'), 16).toString().substr(0,6));
});
另一种解决方案是执行randomBytes
,直到获得6位数值:
var crypto = require('crypto');
var secureVal = 0;
function generateSecureVal(cb) {
crypto.randomBytes(3, function(err, buffer) {
secureVal = parseInt(buffer.toString('hex'), 16);
if (secureVal > 999999 || secureVal < 100000) {
generateSecureVal(cb);
} else {
cb();
}
});
}
generateSecureVal(function(){
console.log(secureVal);
});
上面的问题是理论上它可能会陷入无休止的循环中,并且它很可能会比第一个例子使用更多的CPU周期。