JavaScript

Números aleatorios criptográficamente seguros en Node

La creación de número criptográficamente es esencial para poder garantizar la seguridad de los datos y comunicaciones frente a posibles ataques. Los números criptográficamente seguros son aquellos que se generan de tal manera que son imprescindibles para cualquier persona que no tenga acceso al sistema. Cuando no es así un atacante los podría adivinar. En JavaScript, la función empleada habitualmente para generar números aleatorios, Math.random(), no es criptográficamente segura. Por lo que no debería usarse para generar secretos destinados a proteger datos. La generación de números aleatorios criptográficamente seguros en Node se debería hacer con las funciones del módulo crypto.

Generar números enteros criptográficamente seguros en Node

La librería crypto se encuentra entre las nativas de Node, por lo que no es necesario instalar ningún paquete para poder usarla, solamente importar las dependencias. Para generar números enteros aleatorios criptográficamente seguros dentro de un rango se puede usar la función crypto.randomInt(min, max). Devolviendo como resultado un número entre min y max, incluyendo ambos valores. Así, solamente hay que importar la función y llamarla para obtener un valor.

const crypto = require("crypto");

const random = crypto.randomInt(100000, 999999);

console.log(random); 

Con lo que se obtiene un valor entero de 6 dígitos. La función también permite obtener el valor de forma asíncrona. Lo que se puede hacer con el siguiente código.

const crypto = require("crypto");

crypto.randomInt(100000, 999999, (err, random) => {
 if (err) throw err;
 console.log(random);
});

Generar números reales criptográficamente seguros en Node

La generación de números reales es un poco más complicada, ya que no existe una función para ello dentro de la librería crypto. Una opción es usar la función crypto.randomBytes(bytes) para generar una serie de bytes aleatorios y luego utilizar estos bytes para generar un número aleatorio real. Así, se puede generar una serie de 8 bytes aleatorios, convertir esta cadena hexadecimal en un número entero de 8 bytes y dividir por el máximo (2^{64}-1) para obtener un número aleatorio entre 0 y 1. Lo que se muestra en el siguiente ejemplo.

const crypto = require("crypto");

const randomBytesAsHex = crypto.randomBytes(8).toString('hex');
const random = parseInt(randomBytesAsHex, 16) / (Math.pow(2, 64) - 1);

console.log(random);

Conclusiones

En esta entrada se ha visto cómo se pueden generar números aleatorios criptográficamente seguros en Node con la librería crypto. Una de las librerías nativas de Node. Al igual que vimos con la generación este tipo de números en Python, es clave usar las funciones de esta librería en lugar de Math.random() cuando los número aleatorios se emplean para proteger datos o comunicaciones.

Imagen de günther en Pixabay

¿Te ha parecido de utilidad el contenido?

Daniel Rodríguez

Share
Published by
Daniel Rodríguez

Recent Posts

Cómo Verificar la Normalidad de tus Datos antes de un Test Estadístico

Antes de aplicar muchos tests estadísticos clásicos (el t-test, el ANOVA, la regresión lineal) aparece…

2 días ago

Docker Compose: el día a día. Cómo ver qué funciona y qué no

Si acabas de montar tu aplicación en Docker Compose, la primera pregunta que haces cada…

4 días ago

Migrar tslane a un paquete dual CommonJS y ESM con tsup y Vitest

tslane es la plantilla que uso como punto de partida para mis librerías TypeScript, nacida…

1 semana ago

Cómo construir tu primer scorecard paso a paso

En los artículos anteriores de esta serie vimos la teoría detrás del credit scoring: qué…

2 semanas ago

Actualizar expresslanets a ES Modules con tsx y Vitest

expresslanets es la plantilla de API REST con Express y TypeScript que empezó como una…

2 semanas ago

Pareto/NBD: cuando el abandono silencioso cambia el CLV

En el artículo del Dashboard vimos que Pareto/NBD aparecía junto a BG/NBD con un ajuste…

3 semanas ago

This website uses cookies.