5

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

var crypto = require('crypto');

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

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

4

2 回答 2

3

2 个字节的最大值为 65535,所以如果你只使用 2 个字节,你永远不会得到 6 位数字。

改为使用 3 个字节,然后使用以下方法将其减少到 6 位substr

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

于 2013-07-07T22:45:32.483 回答
1

执行此操作的新功能已添加到 Node v14.17

crypto.randomInt([min, ]max[, callback])

得到一个 6 位整数。

const crypto = require('crypto');
crypto.randomInt(100000, 999999, (err, n) => {
    if (err) throw err;
    console.log(`Random 6 digit integer: ${n}`);
});

同样根据文档https://nodejs.org/api/crypto.html#cryptorandomintmin-max-callback,您还应该通过以下方式检查您的最小值和最大值是否为安全整数:

Number.isSafeInteger() 
于 2021-12-06T19:53:56.823 回答