Explicado 5 min de lectura

Cómo funcionan los generadores de números aleatorios: PRNG, CSPRNG y aleatoriedad verdadera

Las computadoras son deterministas, entonces, ¿cómo producen números impredecibles? Una guía práctica sobre semillas, algoritmos, entropía y aleatoriedad del navegador.

Los números aleatorios impulsan obsequios, juegos, simulaciones, contraseñas y cifrado. Lo sorprendente es que la mayoría de los números aleatorios no lo son en absoluto. Se producen mediante un proceso determinista que parece impredecible desde fuera.

Conclusiones clave

  • Un generador de números pseudoaleatorios (PRNG) convierte una semilla en una secuencia larga y repetible.
  • Un PRNG criptográficamente seguro (CSPRNG) está diseñado para que los resultados pasados ​​prácticamente no puedan revelar los futuros.
  • La verdadera aleatoriedad proviene de fuentes físicas de entropía, no sólo de un algoritmo.
  • Los navegadores exponen un CSPRNG a través de crypto.getRandomValues(), que es la opción correcta para los sorteos justos diarios.
  • La equidad también depende de cómo se asignan los valores a un rango: la aritmética de módulo sesgada puede favorecer silenciosamente algunos resultados.

Por qué la aleatoriedad es más difícil de lo que parece

Anuncio
Vista previa de la ubicación del anuncio

Una computadora sigue instrucciones. Si ejecuta el mismo programa dos veces con las mismas entradas, normalmente obtendrá el mismo resultado. Un generador de números aleatorios debe romper esa expectativa sin romper la máquina.

El software suele resolver el problema en dos capas. Primero, recopila una pequeña cantidad de datos impredecibles, llamados entropía, de fuentes como fluctuaciones de tiempo, eventos de teclado o ruido de hardware. En segundo lugar, utiliza esa entropía como semilla para un algoritmo que produce un largo flujo de números. La secuencia parece aleatoria, pero está completamente determinada por la semilla y el algoritmo.

Ese diseño es útil. Hace que los números aleatorios sean reproducibles para simulaciones y pruebas. También significa que un generador mal sembrado puede repetir la misma secuencia en diferentes máquinas, razón por la cual la calidad de la semilla es importante.

Qué hace un generador de números pseudoaleatorios

Un PRNG mantiene un estado interno. Cada vez que solicitas un número, transforma el estado y devuelve parte del resultado. La transformación suele ser rápida y determinista. Dado el mismo estado inicial, vuelve a aparecer la misma secuencia.

La mayoría de los PRNG eventualmente repiten su estado. El número de valores antes de la repetición se llama período. Un período prolongado es útil, pero no hace que un generador sea seguro automáticamente. Un atacante que pueda observar una cantidad suficiente de resultados puede reconstruir el estado interno y predecir valores futuros.

PRNG frente a CSPRNG

Un PRNG de propósito general está optimizado para brindar velocidad y calidad estadística. Un CSPRNG está diseñado para resistir la predicción. Utiliza primitivas criptográficas y está diseñado para que el aprendizaje de una salida no revele la siguiente.

Math.random() de JavaScript no es adecuado para trabajos sensibles a la seguridad. Es rápido y conveniente, pero los motores no garantizan la calidad criptográfica. Los navegadores proporcionan crypto.getRandomValues() para aleatoriedad relevante para la seguridad. Llena una matriz escrita con bytes aleatorios utilizando la fuente criptográfica de la plataforma.

Para contraseñas, tokens, sorteos justos con premios y cualquier cosa que un atacante quiera predecir, utilice un CSPRNG. Para una animación decorativa o una simulación aproximada, un PRNG normal puede ser suficiente.

De dónde viene la verdadera aleatoriedad

Ningún algoritmo de software puede crear información a partir de la nada. La verdadera aleatoriedad ingresa al sistema a través de procesos físicos: desintegración radiactiva, ruido térmico o el momento preciso de la entrada del usuario. Los sistemas operativos recopilan estas señales en un grupo de entropía y las utilizan para generar generadores criptográficos.

Los sistemas operativos y navegadores modernos combinan la entropía continuamente. No es necesario mover el mouse para hacer un sorteo justo, pero el sistema necesita una fuente saludable de entropía durante el arranque y después de largos períodos sin actividad. Ésta es una de las razones por las que los generadores criptográficos se diseñan cuidadosamente en lugar de improvisarse.

Cómo funcionan los generadores de este sitio

Las herramientas de este sitio utilizan crypto.getRandomValues() en su navegador. Los resultados se generan localmente y no se cargan.

Para rangos de enteros, el navegador devuelve un valor sin signo de 32 bits. Un enfoque ingenuo utiliza el resto después de la división, pero eso puede introducir un pequeño sesgo cuando el rango no se divide uniformemente en todo el espacio de 32 bits. En su lugar, los generadores utilizan muestreo de rechazo: los valores fuera de la región imparcial se descartan y se vuelven a dibujar. El resultado es una distribución uniforme en todo el rango solicitado.

Las barajadas utilizan el algoritmo de Fisher-Yates con índices aleatorios seguros. A diferencia de una clasificación casual con un comparador aleatorio, Fisher-Yates produce cada permutación con igual probabilidad cuando los índices aleatorios son uniformes.

¿Qué es lo suficientemente aleatorio para su caso de uso?

Utilice pseudoaleatoriedad ordinaria para animaciones, arte de juegos o simulaciones aproximadas donde la previsibilidad no tiene costo. Utilice un CSPRNG para:

  • Contraseñas y códigos de recuperación.
  • Sorteos, sorteos y audiciones con premio real.
  • Asignación aleatoria de personas a equipos o grupos.
  • Tokens, identificadores de sesión y todo lo relacionado con la seguridad.
  • Cualquier empate deberás defenderlo públicamente.

Para claves criptográficas a largo plazo, utilice un sistema de administración de claves dedicado en lugar de un sitio web. La aleatoriedad del navegador es fuerte, pero el ciclo de vida, el almacenamiento y el control de acceso de las claves son tan importantes como los bits iniciales.

Una simple verificación de equidad

Puedes probar un generador de manera informal ejecutando muchos sorteos y observando la distribución. Con un dado de seis caras, cada cara debería aparecer aproximadamente una sexta parte del tiempo. Las tiradas cortas variarán y las rachas son normales. Lo que importa es si el proceso es imparcial en muchas pruebas y si es lo suficientemente reproducible como para auditarlo.

Para sorteos públicos, registre las entradas, la configuración y el resultado. El registro contribuye más a la confianza que cualquier afirmación de aleatoriedad.

Conclusión

La aleatoriedad es una cadena de decisiones de ingeniería: recopilación de entropía, elección de algoritmos, mapeo imparcial y uso transparente. Un buen generador no tiene por qué ser misterioso. Tiene que ser impredecible cuando sea importante, documentado cuando se utilice y honesto acerca de sus límites.

Prueba la herramienta

Generador de números aleatorios

Elija números enteros en cualquier rango.

abre el generador
Por nuestro equipo editorial

Guías independientes y herramientas de navegador gratuitas para elecciones aleatorias justas y transparentes.

Acerca de