如何使用randomBytes()在node.js中生成随机的6位密码短语

时间:2013-07-07 22:30:24

标签: javascript node.js random cryptography

我正在尝试在Node.js中生成准确6个随机数字,这需要加密安全。这是我的代码:

var crypto = require('crypto');

crypto.randomBytes(2, function(err, buffer) {
    console.log(parseInt(buffer.toString('hex'), 16));
});

问题是这个结果可能是45个数字,因为我们正在从十六进制转换为十进制。有没有办法保持加密安全功能randomBytes(),但保证6位数的结果?

1 个答案:

答案 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周期。