Contenido del curso
Conceptos Criptográficos
Criptografía Simétrica
- 9

Cifrado por bloques vs flujo en criptografía
06:17 min - 10

"Funcionamiento del Estándar de Cifrado Avanzado AES"
07:05 min - 11

Cifrado y Descifrado de Archivos con AES en Línea de Comandos
12:36 min - 12

Funciones de Hash y su Importancia en Criptografía
04:35 min - 13

Funciones de Hash y HMAC en Línea de Comandos con OpenSSL
10:40 min
Criptografía Asimétrica
- 14

Aritmética Modular en Criptografía: Fundamentos y Aplicaciones
05:22 min - 15

Intercambio de Llaves en Criptografía Moderna
05:50 min - 16

Criptografía Asimétrica: Algoritmo Diffie-Hellman y su Aplicación
03:53 min - 17

Implementación de Diffie-Hellman en Línea de Comandos
12:42 min - 18

Cómo RSA cifra y firma mensajes
09:31 min - 19

Implementación de RSA en Línea de Comandos para Firmado de Documentos
17:39 min - 20

Criptografía de curvas elípticas en la práctica
04:44 min - 21

Firma Digital con Algoritmos de Curvas Elípticas (ECDSA)
05:36 min
Criptografía Moderna
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,integeryuuid, declarados como constante para que TypeScript infiera correctamente el tipo. - size (alias
s): controla la longitud de la llave criptográfica. El default recomendado es16, 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ámetroencoding, 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?
randomBytesdevuelve un buffer de bytes crudos que necesitas codificar a string.randomIntdevuelve directamente un número entero dentro de un rango definido porminymax.
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:
- Generar 16 bytes en hexadecimal:
yarn run cli prng --type bytes. - Generar 32 bytes para una llave más larga:
yarn run cli prng --type bytes -s 32. - 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.