【问题标题】:Convert crypto.randomBytes() to 8 digit random integer将 crypto.randomBytes() 转换为 8 位随机整数
【发布时间】:2021-09-23 08:53:26
【问题描述】:

在我的 node.js 服务器端代码中,尝试创建 8 位随机数时,结果与预期不符。

我试过下面的代码,

const crypto = require('crypto');
var token = crypto.randomBytes(8);

console.log(token);

它仍然返回缓冲的字节数组,即<Buffer 1d c3 02 b1 d1 0b e9 dc>。 尝试了很多方法将该字节数组转换为 8 位数字,例如 98988348(不是十六进制数字)。

但仍然无法得到 8 位随机数。

注意:这里不要使用Math.random()

【问题讨论】:

    标签: javascript node.js arrays cryptojs


    【解决方案1】:

    crypto.randomInt (Node.js v14.10+/v12.19+)

    从 Node.js v14.10(和 v12.19)开始,crypto module 导出一个 randomInt([min], max, [callback]) 函数,该函数返回一个随机整数 n,使得 min <= n < max。该函数继承了crypto 模块作为一个整体提供的所有安全优势。

    因此,要获得一个随机的 8 位整数,您需要调用 randomInt 函数,其最小值为 10000000,最大值为 100000000

    const { randomInt } = require('crypto');
    
    const n = randomInt(10000000, 100000000);
    

    crypto.randomBytes

    没有严格的 Node.js 版本要求的替代方法是将缓冲区转换为十六进制字符串,然后使用 parseInt 函数将 base 参数指定为 16(用于十六进制)。

    然后,您可以将该解析后的整数除以可能的最大值 (0xffffffffffffffff),以获得 0 到 1 之间的加密安全数字。

    现在您只需将其乘以 (max - min)(在您的情况下为 90000000),然后加上 min (10000000)。

    const { randomBytes } = require('crypto');
    
    const token = crypto.randomBytes(8);
    const hex = token.toString('hex');
    
    const min = 10000000;
    const max = 100000000;
    
    let n = parseInt(hex, 16); // 0   <= n < 2^64
    n /= 0xffffffffffffffff;   // 0   <= n < 1
    n *= max - min;            // 0   <= n < max - min
    n += min;                  // min <= n < max
    

    【讨论】:

    • 谢谢Luke,请问有没有针对旧版本节点的其他解决方案?
    • 请查看我编辑的答案以及仅使用 randomBytes 的替代方案。
    • 但它会将其输出为十进制数,如 0.4184526527047584。但我只需要8位随机整数
    • 我试图让你自己弄清楚:) 你需要将数字乘以 (max - min) 然后加上最小值(你的最小值是 10000000,你的最大值是100000000)。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    相关资源
    最近更新 更多