Generación de Números Aleatorios con Node.js

Clase 6 de 25Curso de Fundamentos de Criptografía

Contenido del curso

Criptografía Asimétrica

Resumen

Construir tu propio generador de números pseudoaleatorios (PRNG) es una habilidad fundamental para cualquier persona que trabaje con criptografía o seguridad informática. A continuación se explica paso a paso cómo crear una herramienta de línea de comandos en Node.js que produce bytes aleatorios, enteros dentro de un rango y UUIDs, utilizando exclusivamente la librería estándar crypto.

¿Cómo se estructura la línea de comandos para un PRNG?

El punto de partida es un archivo que ya contiene una interfaz de línea de comandos preconfigurada. Sobre ella se añade un nuevo comando llamado PRNG, acrónimo de pseudorandom number generation [1:14]. Este término es el que encontrarás en documentación técnica y fuentes especializadas para referirte a la generación de números que parecen aleatorios pero se producen mediante algoritmos deterministas.

Dentro del builder del comando se definen varias opciones:

  • type: indica qué clase de aleatoriedad se desea. Las opciones disponibles son bytes, int (enteros) y uuid [2:44].
  • size: determina la longitud en bytes del resultado. Su valor por defecto es 16 bytes, una longitud generalmente suficiente para la mayoría de aplicaciones de seguridad [3:52].
  • min y max: aplican solo cuando el tipo es entero. Permiten acotar el rango del número generado, y el resultado es incluyente en ambos extremos [4:22].
  • encoding: controla el formato de salida. Puede ser hexadecimal, base64 u otras codificaciones soportadas por Node.js. El valor por defecto es hexadecimal porque resulta el más práctico de leer y manipular [5:30].

¿Por qué se exige el parámetro type como obligatorio?

Sin este dato la herramienta no sabe qué tipo de información el usuario necesita. Marcarlo como dempieces (requerido) evita ambigüedades y garantiza que siempre se ejecute la rama correcta del generador [3:08].

¿Para qué sirve definir el tamaño de la llave?

Algunos mecanismos como JWT requieren una llave secreta de longitud específica. Con el parámetro size puedes generar llaves criptográficas del largo exacto que tu aplicación necesite, directamente desde la terminal [3:52].

¿Cómo se implementa la función generadora con crypto?

Se crea un archivo separado para mantener el código organizado. Lo primero es importar la librería crypto, que ya viene incluida en Node.js y no requiere instalación adicional [6:36]. Si trabajas con otro lenguaje, asegúrate de que su librería estándar ofrezca una interfaz similar.

La función principal recibe type, size, min, max y encoding como parámetros, y utiliza un switch para decidir qué generar:

typescript import crypto from 'crypto';

export default function prng( type: 'bytes' | 'int' | 'uuid', size: number, min: number, max: number, encoding: BufferEncoding ): string | number { switch (type) { case 'bytes': return crypto.randomBytes(size).toString(encoding); case 'int': return crypto.randomInt(min, max); case 'uuid': return crypto.randomUUID(); } }

  • crypto.randomBytes(size) devuelve un buffer de bytes aleatorios que se convierte a string con el encoding recibido [8:00].
  • crypto.randomInt(min, max) regresa un entero aleatorio dentro del rango indicado. Al ser ya un número, no necesita codificación adicional [8:52].
  • crypto.randomUUID() genera un identificador único basado en el estándar UUID sin requerir parámetros extra [9:18].

¿Qué es el buffer encoding y por qué importa?

Cuando randomBytes produce datos crudos, estos no son legibles. El buffer encoding los transforma a una representación textual —hexadecimal, base64, entre otras— para que puedas copiarlos, almacenarlos o compartirlos fácilmente [8:10].

¿Cómo se prueba el generador desde la terminal?

Después de exportar la función e importarla en el handler de la línea de comandos, se extraen los argumentos procesados por el builder y se pasan en el orden correcto [9:48].

Ejemplos de ejecución:

  • yarn runcli prng --type bytes genera 16 bytes aleatorios en hexadecimal [10:32].
  • yarn runcli prng --type bytes --size 32 produce un string hexadecimal el doble de largo [10:50].
  • yarn runcli prng --type int --min 45 --max 85 entrega un entero aleatorio entre 45 y 85 [11:32].

Durante las pruebas se detectó que los valores de min y max estaban intercambiados en la línea de comandos. Corregir este tipo de errores en etapas tempranas es esencial para evitar resultados inesperados [11:10].

Ya cuentas con una herramienta reutilizable para generar números secretos, llaves criptográficas y UUIDs desde tu terminal. Cuéntanos en los comentarios qué otras formas de generar aleatoriedad se te ocurren y comparte tus mejoras con la comunidad.