PRNG criptográficamente seguros
Explore /dev/urandom, ChaCha20-CSPRNG y Fortuna.
PRNG criptográficamente seguros es una lección gratuita de Cryptology Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cryptology Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cryptology Academy incluye 4 lecciones en total.
Resumen de los requisitos de los CSPRNG
Un CSPRNG debe cumplir: (1) impredecibilidad del siguiente bit: aunque se conozcan todos los bits anteriores, el siguiente no se puede predecir con una probabilidad superior a 1/2 + una cantidad despreciable. (2) resistencia a la extensión tras el compromiso del estado: conocer el estado actual no revela nada sobre la salida pasada.
/dev/urandom y getrandom()
Linux /dev/urandom utiliza un CSPRNG sembrado a partir del pool de entropía. Tras la siembra inicial (128 bits de entropía), es seguro utilizarlo incluso cuando el pool está "vacío": el CSPRNG mantiene su propio estado interno. getrandom() es el equivalente moderno mediante una llamada al sistema.
CSPRNG basado en ChaCha20
El kernel de Linux 5.17+ sustituyó su CSPRNG por un diseño basado en ChaCha20. ChaCha20 es rápido (no necesita aceleración por hardware), proporciona una seguridad de 256 bits y cuenta con una demostración de seguridad bien estudiada. El nonce es el contador; la clave procede del pool de entropía.
Fortuna
Fortuna (Ferguson & Schneier, 2003) es un diseño de CSPRNG que mantiene 32 pools de entropía y acumula entropía continuamente. El generador se vuelve a sembrar a partir de los pools a medida que se llenan. Es resistente a los ataques de reinicio del RNG y de compromiso parcial del estado.
Puerta trasera de DUAL_EC_DRBG
NIST SP 800-90A incluía originalmente DUAL_EC_DRBG, basado en curvas elípticas. Los documentos de Snowden revelaron que la NSA insertó una puerta trasera: los puntos de la curva elíptica se eligieron de modo que la NSA pudiera predecir la salida a partir de cualquier semilla. No utilice nunca DUAL_EC_DRBG. NIST lo retiró en 2014.
CTR_DRBG
CTR_DRBG (NIST SP 800-90A) utiliza AES en modo contador como CSPRNG. La semilla = clave de 256 bits + nonce de 128 bits. Cada llamada avanza el contador. Está ampliamente implementado en OpenSSL, BoringSSL y Windows BCrypt. Cuenta con aceleración por hardware en CPU con AES-NI.
HASH_DRBG y HMAC_DRBG
HASH_DRBG utiliza una función hash (SHA-256) de forma iterativa con un valor de semilla. HMAC_DRBG utiliza HMAC para realizar la mezcla. HMAC_DRBG es más sencillo de implementar correctamente y se utiliza en muchos sistemas embebidos (mbedTLS, WolfSSL).
Resiembra e inyección de entropía
Incluso los CSPRNG deben resembrarse periódicamente. CTR_DRBG tiene un intervalo de resiembra de 2^48 solicitudes. Fortuna se vuelve a sembrar a partir de sus pools de entropía. Resiembra manual: añada entropía nueva (bytes de getrandom) al estado del CSPRNG durante el arranque y después de fork().
El problema de fork
Cuando un proceso ejecuta fork, tanto el proceso padre como el hijo heredan el mismo estado del CSPRNG, por lo que producirán una salida idéntica. Solución: llame a getrandom() para volver a sembrar inmediatamente después de fork(). OpenSSL lo gestiona automáticamente mediante pthread_atfork() en versiones recientes.
CSPRNG en la práctica: Python
import secrets key = secrets.token_bytes(32) # 256-bit key nonce = secrets.token_bytes(12) # 96-bit nonce for AES-GCM pin = secrets.randbelow(10**6) # 6-digit PIN # Never use random module for cryptography
Criptografía del navegador
window.crypto.getRandomValues(typedArray) es el CSPRNG del navegador. Utiliza la fuente de entropía del sistema operativo. La API WebCrypto lo utiliza para generar claves. No utilice nunca Math.random() con fines de seguridad: es un PRNG no criptográfico sembrado a partir de la hora del sistema.
Comprobación rápida
¿Qué módulo de Python debe utilizar para generar bytes aleatorios criptográficos?
Resumen
Los CSPRNG como ChaCha20, CTR_DRBG y Fortuna generan salidas impredecibles a partir de semillas de entropía. Evite DUAL_EC_DRBG, random.random() y Math.random(). Utilice secrets (Python) o window.crypto (navegador). Siguiente: fallos de entropía en el mundo real.
Preguntas frecuentes
¿La lección «PRNG criptográficamente seguros» es gratis?
Sí — el texto completo de «PRNG criptográficamente seguros» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cryptology Academy, actualiza a CoddyKit PRO. El curso de Cryptology Academy incluye 4 lecciones en total.
¿Qué aprenderé en «PRNG criptográficamente seguros»?
Explore /dev/urandom, ChaCha20-CSPRNG y Fortuna. Practicas Cryptology Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Cryptology Academy?
No se requiere experiencia previa. Cryptology Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «PRNG criptográficamente seguros»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Cryptology Academy?
Sí. Cada lección de Cryptology Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Aleatoriedad verdadera frente a pseudoaleatoriedad
- PRNG criptográficamente seguros
- Agotamiento de entropía y errores de claves débiles
- Generación segura de claves, nonces e IV