Contenido del curso

Criptografía Asimétrica

Generador PRNG con crypto en Node.js

Resumen

Crear un generador de números pseudoaleatorios en Node.js es el primer paso para construir herramientas criptográficas confiables desde tu propia línea de comandos. Aquí aprendes a implementar un comando PRNG capaz de producir bytes, enteros y UUIDs, listo para integrarse en proyectos reales que requieran llaves seguras o identificadores únicos.

Si trabajas con otro lenguaje, tranquilo: la mayoría incluye una librería estándar con funciones equivalentes, así que puedes seguir el mismo razonamiento.

¿Qué es PRNG y por qué importa en criptografía?

Las siglas PRNG vienen de Pseudorandom Number Generation, y es el nombre técnico que verás en documentación y artículos especializados [01:00]. Este tipo de generadores son la base para crear llaves, tokens y secretos en sistemas como JWT.

¿Qué es un PRNG? Es un algoritmo que produce secuencias de números que parecen aleatorios pero son generados de forma determinista a partir de una semilla. Se usa cuando necesitas valores impredecibles para criptografía, identificadores o llaves.

La idea es que tu CLI reciba un tipo de aleatoriedad y devuelva el valor en el formato que necesites: bytes, enteros o UUIDs.

¿Cómo configurar el comando PRNG en la CLI?

Dentro del archivo principal de comandos vas a registrar uno nuevo llamado prng con su descripción y su función handler. La pieza clave es el builder, donde defines los argumentos que el usuario podrá pasar [02:00].

Las opciones que configuras son:

  • type: define el tipo de aleatoriedad. Sus choices son bytes, integer y uuid, declarados como constante para que TypeScript infiera correctamente el tipo.
  • size (alias s): controla la longitud de la llave criptográfica. El default recomendado es 16, ya que 16 bytes suelen ser suficientes para la mayoría de aplicaciones.
  • min y max: aplican solo cuando trabajas con enteros. El resultado será un número entre ambos valores, incluyente en los dos extremos.
  • encoding: formato de salida. El default es hexadecimal porque es el más cómodo de manipular visualmente.

Declarar las choices como constante (as const) no es un detalle menor: permite que TypeScript las reconozca como tipos literales y las puedas reutilizar en la firma de tu función.

¿Por qué marcar el tipo como obligatorio?

Porque sin esa información la herramienta no sabe qué clase de aleatoriedad debe entregar. No es lo mismo pedir bytes crudos que un identificador UUID, y forzar al usuario a declararlo evita errores silenciosos.

¿Cómo implementar la función generadora con la librería crypto?

Para mantener el código ordenado, crea una carpeta nueva con un archivo dedicado a la lógica del PRNG. Importa el módulo crypto, que viene incluido de fábrica en Node.js [05:30].

La función recibe cuatro parámetros: type, size, min, max y encoding. Internamente usa un switch sobre el tipo y delega a la función correcta de la librería:

  • bytes: usa crypto.randomBytes(size), que devuelve un buffer. Por eso necesitas el parámetro encoding, para convertirlo a string legible con .toString(encoding).
  • integer: usa crypto.randomInt(min, max). Como ya retorna un número, basta con devolverlo directo o convertirlo a string sin base.
  • uuid: usa crypto.randomUUID(), que retorna un string siguiendo el estándar UUID sin requerir parámetros adicionales.

El tipo del encoding corresponde a BufferEncoding, un tipo nativo de Node que cubre formatos como hex, base64 o utf8.

¿Cuál es la diferencia entre randomBytes y randomInt? randomBytes devuelve un buffer de bytes crudos que necesitas codificar a string. randomInt devuelve directamente un número entero dentro de un rango definido por min y max.

Una vez lista la función, la exportas por default y la importas en el handler de la CLI. Ahí desestructuras los parámetros del builder y los pasas en el orden correcto: type, size, min, max, encoding. Cierras con un console.log para mostrar el resultado.

¿Cómo probar el generador en la terminal?

Desde el directorio del proyecto ejecutas yarn run cli prng y deberías ver la descripción del comando junto con sus opciones. Algunos ejemplos prácticos:

  1. Generar 16 bytes en hexadecimal: yarn run cli prng --type bytes.
  2. Generar 32 bytes para una llave más larga: yarn run cli prng --type bytes -s 32.
  3. Generar un entero entre 45 y 85: yarn run cli prng --type integer --min 45 --max 85.

Si al pedir un entero el rango parece invertido, revisa el orden en que pasas min y max al handler. Es un error común: los parámetros pueden quedar swapeados y producir resultados fuera del rango esperado [12:00].

¿Para qué puedes usar este generador en proyectos reales?

Una vez funcionando, esta herramienta te sirve para varios escenarios concretos:

  • Crear llaves criptográficas para firmar JWT con la longitud exacta que el algoritmo exige.
  • Generar secretos para variables de entorno sin depender de servicios externos.
  • Producir identificadores únicos con UUID para registros en bases de datos.
  • Obtener números aleatorios dentro de rangos específicos para pruebas o lógica de negocio.

La ventaja de tenerlo en tu CLI es que lo invocas en segundos sin abrir un playground ni escribir un script desechable cada vez.

¿Qué otras formas de aleatoriedad agregarías a tu generador? Cuéntame en los comentarios cómo lo extenderías y comparte tu implementación con el resto de la comunidad.