En mi código del lado del servidor node.js, al intentar crear un número aleatorio de 8 dígitos, el resultado no es el esperado.
Intenté debajo del código,
const crypto = require('crypto'); var token = crypto.randomBytes(8); console.log(token); Aún así, devuelve bytearray almacenado en búfer, que es <Buffer 1d c3 02 b1 d1 0b e9 dc> . Probé muchos métodos para convertir esa matriz de bytes en un número de 8 dígitos como 98988348 (no hexadecimal).
Pero aún no puedo obtener el número aleatorio de 8 dígitos.
Nota: No quiero usar Math.random() aquí.
A partir de Node.js v14.10 (y v12.19), el módulo crypto exporta una randomInt([min], max, [callback]) que devuelve un número entero aleatorio n tal que min <= n < max . Esta función hereda todos los beneficios de seguridad que proporciona el módulo crypto en su conjunto.
Entonces, para obtener un número entero aleatorio de 8 dígitos, buscaría invocar la función randomInt con un valor mínimo de 10000000 y un máximo de 100000000 :
const { randomInt } = require('crypto'); const n = randomInt(10000000, 100000000); Una alternativa que no tiene requisitos estrictos de versión de Node.js sería convertir su búfer en una cadena hexadecimal y luego usar la función parseInt especificando el parámetro base como 16 (para hexadecimal).
Luego puede dividir ese número entero analizado por el valor más grande posible ( 0xffffffffffffffff ) para obtener un número criptográficamente seguro entre 0 y 1.
Ahora solo necesita multiplicar esto por (max - min) (90000000 en su caso) y luego agregar el 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