¿Cuál es la diferencia entre los números pseudoaleatorios y los números aleatorios reales? - Cómo distinguirlos

· Actualizado el: · · Números pseudoaleatorios, Números aleatorios reales, RNG, CSPRNG, Seguridad

Las conversaciones sobre números aleatorios se desvían enseguida, porque cosas bastante distintas se agrupan todas bajo la misma palabra, aleatorio. Tanto una secuencia calculada como Math.random() como una secuencia obtenida de un fenómeno físico como el ruido térmico o el jitter del reloj parecen, a simple vista, igual de dispersas.

Sin embargo, en la práctica, dejar esta diferencia en la ambigüedad hace que sea fácil equivocarse en decisiones como estas.

  • Querer reproducir una simulación, pero obtener resultados distintos cada vez
  • Generar un token de restablecimiento de contraseña con un número aleatorio fácil de predecir
  • Dar por sentado que algo «es un número aleatorio real» solo porque pasó las pruebas estadísticas
  • Al contrario, malinterpretar que todo lo pseudo es peligroso con solo oír la palabra

En este artículo ordenamos qué es un número pseudoaleatorio, qué es un número aleatorio real y cómo distinguirlos, de una forma fácil de aplicar en el juicio práctico diario. En particular, el eje central es mirar la configuración del generador, no el aspecto de la salida.

El contenido de este artículo se basa en la documentación oficial de NIST, IETF, los sistemas operativos y los lenguajes que se podía consultar en abril de 2026.

Índice

  1. Primero, la conclusión (en una frase)
  2. Qué entendemos en este artículo por «número pseudoaleatorio» y «número aleatorio real»
  3. Primero, un resumen en una sola imagen
    • 3.1. Diagrama de relaciones
    • 3.2. Resumen mínimo de la terminología
  4. Qué es un número pseudoaleatorio
    • 4.1. En una frase
    • 4.2. Distinguir el PRNG normal del CSPRNG
  5. Qué es un número aleatorio real
    • 5.1. En una frase
    • 5.2. El número aleatorio físico tampoco se usa siempre tal cual
  6. En qué se diferencian
    • 6.1. Origen de la generación
    • 6.2. Reproducibilidad
    • 6.3. Previsibilidad
    • 6.4. Velocidad y operación
  7. Cómo distinguirlos
    • 7.1. En principio, la salida por sí sola no basta para distinguirlos
    • 7.2. Lo primero que hay que revisar es el diseño del generador
    • 7.3. A continuación, buscar defectos evidentes con pruebas estadísticas
    • 7.4. En usos de seguridad, mirar desde el punto de vista del atacante
  8. Qué usar según el propósito
    • 8.1. Ejemplo mínimo de uso
  9. Errores habituales
  10. Tabla de decisión para cuando dude en la práctica
  11. Resumen
  12. Referencias

1. Primero, la conclusión (en una frase)

Antes que nada, dicho de forma bastante simplificada pero útil para el trabajo diario, es así:

  • El número pseudoaleatorio es una secuencia que se genera de forma determinista a partir de un estado interno y un algoritmo
  • El número aleatorio real es una secuencia cuya fuente de entropía es un fenómeno físico, como el ruido térmico o el jitter
  • Sin embargo, muchas de las API de números aleatorios seguras que se usan en la práctica no devuelven directamente el número aleatorio físico, sino un DRBG / CSPRNG cuyo seed proviene de una fuente de entropía
  • Por eso, no basta con ver si parece aleatorio para distinguirlos. Lo que hay que revisar es la configuración del generador, cómo entra el seed, si hay reseed y si existe health test
  • En simulaciones y pruebas de reproducción, la reproducibilidad del número pseudoaleatorio es un arma a favor
  • En usos de seguridad como claves, tokens o nonces, lo básico es usar la API de números aleatorios segura que ofrece el sistema operativo o el lenguaje

En resumen, si primero distingue estas tres categorías, es difícil equivocarse.

  1. ¿Se trata de un PRNG normal?
  2. ¿Se trata de un PRNG criptográfico / CSPRNG / DRBG?
  3. ¿Se trata de un NRBG / TRNG con fuente de entropía física?

2. Qué entendemos en este artículo por «número pseudoaleatorio» y «número aleatorio real»

En esta conversación, decir simplemente número aleatorio abarca demasiado. Por eso, primero fijamos el significado de cada término.

  • Número pseudoaleatorio (PRNG): una secuencia que se genera con un procedimiento determinista a partir de un seed y un estado interno. En las mismas condiciones, se obtiene la misma secuencia
  • Número pseudoaleatorio criptográfico (CSPRNG / DRBG): un tipo de número pseudoaleatorio, pero centrado en la imprevisibilidad. La NIST SP 800-90A define este deterministic random bit generator
  • Número aleatorio real: en el lenguaje cotidiano, suele referirse a lo que se llama número verdaderamente aleatorio o número aleatorio físico. En la NIST, el término más cercano es NRBG (non-deterministic random bit generator), que se describe como un generador que consulta siempre una fuente de entropía y que, en condiciones normales, produce una salida de full entropy

Como la denominación varía según el campo, fijamos de antemano también la correspondencia entre el lenguaje cotidiano y la terminología de las normas. De aquí en adelante, usaremos la denominación de la columna de la izquierda.

Denominación en este artículo Otras expresiones habituales Sigla correspondiente Desarrollo en inglés
Número pseudoaleatorio Número pseudo-aleatorio PRNG pseudorandom number generator
Número pseudoaleatorio criptográfico Número pseudoaleatorio criptológico, número aleatorio para uso criptográfico CSPRNG, DRBG cryptographically secure pseudorandom number generator, deterministic random bit generator
Número aleatorio real Número verdaderamente aleatorio, número aleatorio verdadero, número aleatorio físico, número aleatorio por hardware NRBG, TRNG non-deterministic random bit generator, true random number generator
Fuente de entropía Fuente de ruido entropy source

Dos aclaraciones adicionales.

  • Los términos que usan las NIST SP 800-90A / 90B / 90C son DRBG, NRBG y entropy source. CSPRNG y TRNG no son términos de las normas, sino denominaciones muy usadas en la práctica y en la bibliografía
  • En japonés se usan tanto 疑似 como 擬似 para «pseudo». En este artículo se unifica como 疑似乱数. Solo los nombres de los documentos citados en las referencias se dejan como en el original

Lo importante aquí es que número pseudoaleatorio y número aleatorio peligroso no son sinónimos.

Por ejemplo, un PRNG rápido como el método congruencial lineal o un xorshift simple, y un CSPRNG como CTR_DRBG o HMAC_DRBG, son ambos deterministas, pero su significado en términos de seguridad es bastante distinto.

3. Primero, un resumen en una sola imagen

3.1. Diagrama de relaciones

Lo más rápido es empezar viendo de un vistazo cómo se relacionan estos conceptos.

Cómo se construye un número aleatorio seguro a partir de una fuente de entropíaDiagrama que muestra dos caminos de generación. un fenómeno físico, como el ruido térmico o el jitter, alimenta una fuente de entropía que hace de seed o reseed de un DRBG o CSPRNG, el cual expande rápidamente el número que la API del sistema operativo o la biblioteca devuelve, en paralelo, un estado interno más una fórmula matemática produce un PRNG normal cuya salida solo parece aleatoria.Fenómeno físicoruido térmico, jitter, etc.Fuente de entropíaseed / reseedDRBG / CSPRNGexpande el número rápidamenteNúmero que devuelve el SO / la bibliotecaEstado interno + fórmulaPRNG normalSecuencia con apariencia aleatoria

Lo importante aquí es que la salida de la API de números aleatorios segura que recibe la aplicación es algo distinta tanto del PRNG normal de la derecha como del ruido físico crudo de la izquierda.

Muchas implementaciones usan la fuente de entropía de la izquierda para hacer seed / reseed, y a partir de ahí devuelven un valor expandido rápidamente mediante un DRBG / CSPRNG. Las NIST SP 800-90B y 800-90C son precisamente los documentos que ordenan esta configuración de entropy source + deterministic generator.

3.2. Resumen mínimo de la terminología

Tipo Con qué se genera Se reproduce en las mismas condiciones Qué exige sobre todo Uso adecuado
PRNG normal Fórmula matemática y estado interno Velocidad, reproducibilidad Simulación, videojuegos, pruebas
CSPRNG / DRBG Algoritmo criptográfico + seed Imprevisibilidad Claves, tokens, nonces, ID de sesión
Número aleatorio real / NRBG Fuente de entropía física Básicamente no Incertidumbre física, entropía Suministro de seed, dispositivos de autenticación, sorteos con auditoría exigente

Para recordarlo de la forma más breve posible:

  • El PRNG normal es un número aleatorio que se puede reproducir
  • El CSPRNG es un número aleatorio que se puede reproducir, pero que se diseña para que sea difícil de predecir desde fuera
  • El número aleatorio real es un número aleatorio que extrae entropía de un fenómeno físico

4. Qué es un número pseudoaleatorio

4.1. En una frase

El número pseudoaleatorio es aquel que se crea por cálculo, actualizando un estado interno para producir una secuencia con apariencia de aleatoria.

Si se introduce el mismo seed, se usa el mismo algoritmo y se extraen valores el mismo número de veces, se obtiene la misma secuencia de valores. Esto suele parecer un defecto, pero en simulaciones, pruebas y depuración es, más bien, una gran ventaja.

Precisamente porque se puede reproducir, es posible operar de formas como con este seed aparece el error o quiero comparar de nuevo el resultado de ayer.

4.2. Distinguir el PRNG normal del CSPRNG

Este es el punto donde más fácilmente se produce un malentendido. Número pseudoaleatorio = falso = no se debe usar no es correcto.

La NIST SP 800-90A define generadores de bits aleatorios deterministas (deterministic random bit generator) basados en funciones hash o cifrados por bloques. Es decir, buena parte del núcleo de los números aleatorios que se usan para fines criptográficos también son generadores deterministas.

La diferencia no está en la mera apariencia de aleatoriedad, sino en la imprevisibilidad desde el punto de vista de un atacante.

  • PRNG normal
    • Es rápido
    • Es fácil de reproducir
    • Si se filtra el estado interno o el seed, es fácil de predecir
  • CSPRNG / DRBG
    • También es determinista
    • Sin embargo, se diseña para que, partiendo de que el estado interno es desconocido, la salida sea difícil de predecir
    • Es el que se debe usar en usos de seguridad

Por eso, si se juzga la seguridad solo por si es un número pseudoaleatorio o no, casi siempre se acierta mal. Lo que hay que mirar es de qué número pseudoaleatorio se trata.

5. Qué es un número aleatorio real

5.1. En una frase

El número aleatorio real es el que extrae entropía de una incertidumbre física, como el ruido térmico, el jitter de un oscilador, el ruido de avalancha o los fenómenos cuánticos.

En el lenguaje cotidiano se llama número verdaderamente aleatorio o número aleatorio físico. En la terminología de la NIST, el término más cercano es NRBG, definido como un generador que accede siempre a una fuente de entropía y que, mientras funciona con normalidad, produce una salida de full entropy.

5.2. El número aleatorio físico tampoco se usa siempre tal cual

Esto también es importante. El hecho de que sea un número aleatorio real no significa que el valor medido en bruto se entregue tal cual a la aplicación.

Una fuente física tiene varias dificultades prácticas.

  • Tiene sesgos
  • Se ve afectada por la temperatura, la alimentación eléctrica, las averías y el deterioro
  • A veces la velocidad de salida en bruto no es muy alta
  • Sin una comprobación de salud (health check), es difícil notar que está averiada

Por eso, en la NIST SP 800-90B se da mucha importancia a los principios de diseño de la fuente de entropía, al concepto de min-entropy, a las pruebas de validación (validation test) y a las pruebas de salud (health testing). Además, en la implementación global, a menudo se usa una configuración de entropy source + DRBG, como la que describe la NIST SP 800-90C.

En definitiva, el número aleatorio real no es algo misterioso en bruto, sino algo que se gestiona incluyendo la fuente física, la evaluación, la supervisión y el postprocesamiento.

6. En qué se diferencian

La diferencia entre tipos de números aleatorios no se puede ordenar solo con si parece aleatorio. Como mínimo, resulta clara si se observa a través de estos cuatro ejes.

6.1. Origen de la generación

  • Número pseudoaleatorio: algoritmo y estado interno
  • Número aleatorio real: fuente de entropía física

Esta es la diferencia más esencial de todas.

6.2. Reproducibilidad

  • Número pseudoaleatorio: se puede reproducir con el mismo seed
  • Número aleatorio real: es difícil obtener la misma secuencia de valores aunque se repita la medición en las mismas condiciones

La reproducibilidad puede ser una fortaleza en las pruebas y una debilidad en un sorteo.

6.3. Previsibilidad

  • PRNG normal: si se puede leer el seed o el estado interno, se puede predecir bastante bien lo que sigue
  • CSPRNG: se diseña para que, mientras el estado interno esté protegido, sea difícil predecir por adelantado
  • Número aleatorio real: si la fuente física está sana, es difícil de predecir, pero un sensor defectuoso o un diseño deficiente es harina de otro costal

En seguridad, este es el eje más importante. Lo que importa no es la dispersión aparente, sino si se puede acertar el valor siguiente.

6.4. Velocidad y operación

  • Número pseudoaleatorio: rápido, estable y fácil de implementar
  • Número aleatorio real: requiere recolección de entropía y supervisión, lo que impone restricciones de velocidad y coste de implementación

Por eso, en un sistema de producción, la opción más realista no es elegir entre solo números aleatorios reales o solo números pseudoaleatorios, sino un CSPRNG cuyo seed proviene de entropía física.

7. Cómo distinguirlos

7.1. En principio, la salida por sí sola no basta para distinguirlos

Esta es la respuesta más importante. No se puede afirmar con certeza esto es un número aleatorio real observando solo una secuencia finita de salidas.

La razón es sencilla: siempre es posible construir un programa determinista que devuelva exactamente la misma secuencia de longitud finita que se acaba de observar. En el caso extremo, bastaría con incrustar esa secuencia en un array o una ROM y devolverla en orden.

Por eso, no se puede decir parece natural, así que es real. La propia NIST SP 800-22 señala que las pruebas estadísticas son solo un primer paso y que, por sí solas, de ninguna manera demuestran la validez del generador.

Dicho al revés, un buen CSPRNG se construye precisamente para que, mirando solo la salida, sea muy difícil de distinguir. Aquí, no poder distinguirlo es, más bien, el propio objetivo de diseño.

7.2. Lo primero que hay que revisar es el diseño del generador

La respuesta del apartado 7.1 fue «con la salida sola no basta». Entonces, ¿qué hay que mirar? Lo que hay que mirar no es la salida, sino el propio generador.

Aunque haya dos secuencias que parezcan seguir la misma distribución uniforme, una puede haberse generado por cálculo a partir de un seed y la otra haberse tomado de un fenómeno físico. Esta diferencia no sale a la luz por mucho que se observe la secuencia; solo se descubre confirmando cómo se generó. Es decir, distinguirlas es una tarea de «confirmación», no de «observación».

Los puntos que hay que confirmar son estos cinco.

  • Qué algoritmo de generación se usa
    • Si es un PRNG simple o un DRBG / CSPRNG
  • De dónde proviene el seed
    • Si es un seed fijo, la hora o poco más que el PID
    • Si proviene de la fuente de entropía del sistema operativo
  • Si se hace reseed
    • Si solo se hace seed una vez al arrancar y ya está
    • Si también se reintroduce durante el funcionamiento
  • Si existe verificación de la fuente de entropía
    • Evaluación de min-entropy
    • Health test
    • Detección de averías
  • Qué API se está usando
    • Si es una implementación propia
    • Si es la API estándar del sistema operativo o del lenguaje

No hace falta revisar los cinco a fondo. Se pueden ver en orden desde arriba y detenerse en cuanto se obtiene la respuesta. En la práctica, casi siempre basta con los dos extremos: qué algoritmo de generación se usa, el primero, y qué API se está usando, el último.

Vistos desde esta perspectiva, la mayoría de los casos se pueden distinguir.

  • Si se fija el seed, sale la misma secuencia cada vez → número pseudoaleatorio
  • Tiene una fuente de entropía física y presupone validation / health test → diseño con una fuente de números aleatorios real
  • Llama a la API segura de números aleatorios del sistema operativo → en la mayoría de los casos es un híbrido de entropía física + CSPRNG

7.3. A continuación, buscar defectos evidentes con pruebas estadísticas

Las pruebas estadísticas no son innecesarias. Al contrario, son importantes. Sin embargo, su papel se parece más a la detección de defectos que a una demostración.

De forma representativa, se examinan aspectos como estos.

  • Sesgo entre 0 y 1
  • Sesgo de las rachas (run)
  • Periodicidad
  • Correlación
  • Entropía aproximada
  • Complejidad lineal

Se suele consultar la NIST SP 800-22 y, en Japón, el conjunto mínimo de pruebas de números aleatorios de CRYPTREC. Son útiles para examinar si esa secuencia tiene sesgos o estructuras anómalas.

Sin embargo, pasarlas no significa que sea un número aleatorio real. Un CSPRNG bien construido también puede pasarlas sin problema, y a la inversa, incluso una fuente de números aleatorios físicos puede fallarlas por un sesgo del sensor o una avería.

La posición de estas pruebas es, en resumen, esta.

  • Pasarlas: por ahora, no se ven defectos evidentes
  • No pasarlas: hay una alta probabilidad de que algo esté mal
  • Por lo tanto, se puede demostrar que es real: eso no se puede afirmar

7.4. En usos de seguridad, mirar desde el punto de vista del atacante

En usos como los tokens de restablecimiento de contraseña, los ID de sesión, los nonces o la generación de claves, la pregunta ¿es real o no? no basta por sí sola.

Lo que realmente hay que examinar es si un atacante puede predecir el siguiente valor.

Por ejemplo,

  • Hacer seed solo con la hora actual
  • Solo mezclar el ID de proceso o un número consecutivo
  • Una implementación propia que no evalúa la calidad del seed
  • Reutilizar para fines de seguridad las API de la familia random

Nada de esto se evita solo con que parezca aleatorio.

Vamos a describir un caso concreto de lo que puede ocurrir.

Supongamos que un token de restablecimiento de contraseña se genera con un PRNG cuyo seed es la hora actual. El atacante, primero, solicita el restablecimiento en su propia cuenta y obtiene un token. Si conoce el token y la hora en que lo solicitó, puede reducir los candidatos de seed a unos pocos segundos alrededor de ese momento. Después, solo tiene que ejecutar el mismo algoritmo para cada candidato y probar en orden los valores que resultarían como token de la víctima elegida.

En este caso, el atacante no ha roto ningún cifrado: simplemente ha reproducido el generador por su cuenta. Tampoco importa si esa secuencia de números aleatorios había pasado las pruebas estadísticas, porque, en el momento en que se pueden enumerar los candidatos de seed, ese valor deja de ser aleatorio para el atacante.

Lo mismo se aplica a los ID de sesión, los códigos de invitación, las contraseñas de un solo uso y los nombres de archivos temporales que se colocan en una carpeta pública. Todo aquello de lo que no se pueda afirmar con seguridad que aunque se adivine, el daño no es grave debe generarse con un RNG seguro.

La IPA (Agencia de Promoción de Tecnologías de la Información de Japón) también recomienda conocer las API relacionadas con la seguridad y las bibliotecas existentes, y evitar implementaciones propias hechas a la ligera. En Python, la documentación indica explícitamente que se debe priorizar el módulo secrets sobre random. En Java, SecureRandom cumple ese mismo papel.

En definitiva, en seguridad importa más si se usa un seed / entropía seguros y una API segura que si es pseudoaleatorio o real.

8. Qué usar según el propósito

Uso Lo adecuado Motivo
Simulación, Monte Carlo, lógica de videojuegos PRNG normal Es rápido y se puede reproducir con el seed
Reproducción de pruebas, reproducción de errores PRNG normal Se puede reproducir la misma entrada
Claves, tokens, nonces, ID de sesión CSPRNG / API de RNG segura del sistema operativo Se necesita imprevisibilidad
Suministro de seed, sorteos con auditoría o responsabilidad exigente Diseño con una fuente de números aleatorios real, o un mecanismo auditable Importa la entropía física y la trazabilidad
El desarrollo de aplicaciones en general necesita un número aleatorio seguro RNG seguro estándar del sistema operativo o del lenguaje Es más difícil equivocarse que con una implementación propia

A nivel de implementación, una elección segura es esta.

  • Windows nativo: BCryptGenRandom
  • .NET: System.Security.Cryptography.RandomNumberGenerator
  • Linux: getrandom()
  • Python: secrets
  • Java: SecureRandom

En Microsoft Learn se explica que BCryptGenRandom de Windows usa por defecto un proveedor conforme al CTR_DRBG de la NIST SP800-90. También getrandom() de Linux está documentado como utilizable para cryptographic purposes con los bytes aleatorios que devuelve. RandomNumberGenerator de .NET, secrets de Python y SecureRandom de Java son, cada una, API pensadas con el uso criptográfico en mente.

8.1. Ejemplo mínimo de uso

Solo con la lista no es fácil ponerse manos a la obra, así que mostramos la forma real de dos ejemplos representativos. En ambos, el punto en común es que no hay que preparar el seed uno mismo: conseguir el seed es tarea de la propia API.

En C# (.NET 8) se usan los métodos estáticos de System.Security.Cryptography.RandomNumberGenerator.

using System;
using System.Security.Cryptography;

// Obtiene un entero entre 0 (inclusive) y 100 (exclusive), sin sesgo
int n = RandomNumberGenerator.GetInt32(0, 100);

// Obtiene 32 bytes para un token y los convierte en una cadena apta para URL
byte[] bytes = RandomNumberGenerator.GetBytes(32);
string token = Convert.ToBase64String(bytes)
    .Replace('+', '-')
    .Replace('/', '_')
    .TrimEnd('=');

Se usa GetInt32 porque, si simplemente se toma «el resto de dividir una secuencia de bytes entre el rango», los valores de los extremos tienden a salir con más frecuencia. Cuando se necesita indicar un rango, conviene usar este método en lugar de calcular el módulo uno mismo.

En Python (3.6 en adelante) se usa el módulo secrets.

import secrets

# Token seguro que se puede incluir en una URL
token = secrets.token_urlsafe(32)

# Entero entre 0 (inclusive) y 100 (exclusive)
n = secrets.randbelow(100)

Como contraste, este es un ejemplo que no se debe usar para el mismo propósito.

import random

# MAL: random es un PRNG orientado a la reproducibilidad, no está pensado para usos de seguridad
token = "".join(random.choices("abcdefghijklmnopqrstuvwxyz0123456789", k=32))

Tanto random como secrets devuelven, en apariencia, una cadena dispersa. La diferencia no está en la salida, sino en de dónde viene el número aleatorio. random es un PRNG centrado en la reproducibilidad que usa el Mersenne Twister, y la propia documentación oficial de Python indica que se debe usar secrets para la gestión de secretos.

9. Errores habituales

9.1. Si pasa las pruebas estadísticas, es un número aleatorio real

No es así. Lo único que eso permite afirmar es, como mucho, que no se ven sesgos evidentes.

9.2. Si es un número aleatorio real, siempre es seguro

No es así. La calidad se degrada por averías de la fuente física, sesgos, defectos de implementación o la falta de health test.

9.3. Los números pseudoaleatorios son todos peligrosos

No es así. El CSPRNG / DRBG es, más bien, el núcleo de las API de números aleatorios seguras que se usan en la práctica.

9.4. En usos de seguridad, se debe usar directamente solo el número aleatorio físico en bruto

Tampoco es necesariamente así. En la práctica, lo habitual es la combinación de una fuente de entropía física con un CSPRNG.

9.5. random o Math.random() ya se dispersan lo suficiente, así que se pueden usar para un token

El propósito es distinto. La dispersión aparente y la imprevisibilidad frente a un atacante son cosas diferentes.

10. Tabla de decisión para cuando dude en la práctica

El orden de razonamiento cuando hay dudas es este.

  1. ¿Quiere reproducir el mismo resultado?
    • Sí → PRNG normal
    • No → siguiente pregunta
  2. ¿Sería un problema que un atacante lo predijera?
    • Sí → RNG seguro estándar del sistema operativo o del lenguaje
    • No → elija según los requisitos de calidad y velocidad
  3. ¿Necesita responsabilidad explicativa o auditoría sobre la propia fuente del número aleatorio?
    • Sí → considere una fuente de números aleatorios física o un servicio certificado
  4. ¿Quiere hacer una implementación propia?
    • Es comprensible ese impulso, pero los números aleatorios son fáciles de estropear, así que empiece por usar la API estándar

Si se sigue este orden, el rumbo a seguir se decide mucho más rápido que si solo se debate entre la disyuntiva de pseudoaleatorio o real.

11. Resumen

Dicho de la forma más simplificada, pero útil en la práctica, la diferencia entre el número pseudoaleatorio y el número aleatorio real es esta.

  • El número pseudoaleatorio se crea por cálculo
  • El número aleatorio real extrae entropía de un fenómeno físico
  • Pero en la práctica, el protagonista de las API de números aleatorios seguras es lo que queda en medio: entropy source + CSPRNG

Es decir, lo que hay que mirar no es la apariencia, sino la configuración.

  • No se puede afirmar con certeza si algo es real solo por la salida
  • Las pruebas estadísticas sirven para detectar defectos, pero no constituyen una demostración
  • En seguridad, lo esencial es si se puede predecir
  • Si se necesita reproducibilidad, use un PRNG; si se necesita imprevisibilidad, use el RNG seguro estándar del sistema operativo o del lenguaje

Si se entiende en este orden, es posible salir de la confrontación simplista de ¿el número pseudoaleatorio es falso?.

12. Referencias

  1. NIST SP 800-90A Rev. 1: Recommendation for Random Number Generation Using Deterministic Random Bit Generators Es el documento base sobre el deterministic random bit generator.

  2. NIST SP 800-90B: Recommendation for the Entropy Sources Used for Random Bit Generation Ordena los conceptos de entropy source, validation y health testing.

  3. NIST SP 800-90C: Recommendation for Random Bit Generator (RBG) Constructions Ordena la configuración de entropy source + DRBG.

  4. NIST SP 800-22 Rev. 1a: A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Applications Explica el papel de las pruebas estadísticas. Es importante que las pruebas son un primer paso, no una demostración.

  5. NIST Glossary: Non-deterministic Random Bit Generator (NRBG) Sirve para confirmar el término de la NIST más cercano a true random.

  6. RFC 4086: Randomness Requirements for Security Ordena las precauciones sobre los números aleatorios y la entropy source en usos de seguridad.

  7. Microsoft Learn: BCryptGenRandom function Explica la API de RNG segura de Windows y el CTR_DRBG del proveedor por defecto.

  8. Linux man page: getrandom(2) Es la API de números aleatorios de Linux utilizable para cryptographic purposes.

  9. Microsoft Learn: clase RandomNumberGenerator Es la API de RNG de alta fortaleza criptográfica de .NET.

  10. Python documentation: secrets — Generate secure random numbers for managing secrets Es la base para manejar números aleatorios de uso en seguridad en Python.

  11. Oracle Java Documentation: SecureRandom Reúne los conceptos del RNG seguro de Java y de seed / entropy.

  12. IPA: Capítulo 3, sección 3. Uso de técnicas criptográficas difíciles de romper y de números pseudoaleatorios Ordena en japonés la importancia del seed, las pruebas y las precauciones de uso de la API.

Artículos recientes con las mismas etiquetas para profundizar en temas cercanos.

Estas páginas sitúan el tema en un contexto más amplio de servicios y decisiones.

El artículo está directamente relacionado con los siguientes servicios.

Consultoría técnica y revisión de diseño

Si desea diferenciar la reproducibilidad orientada a simulaciones de la imprevisibilidad orientada a la seguridad, y ordenar la selección de la API de números aleatorios y el diseño del seed, este es un tema que se presta bien a una consultoría técnica y una revisión de diseño.

Preguntas frecuentes

Preguntas habituales en las consultas sobre el tema del artículo.

¿Cuál es la diferencia entre los números pseudoaleatorios y los números aleatorios reales (verdaderamente aleatorios)?
Los números pseudoaleatorios (PRNG) son una secuencia que un algoritmo genera de forma determinista a partir de un seed y un estado interno: en las mismas condiciones, se obtiene la misma secuencia. Los números aleatorios reales son una secuencia cuya fuente de entropía es un fenómeno físico, como el ruido térmico o el jitter de un oscilador, por lo que es difícil obtener la misma secuencia de valores incluso repitiendo la medición en las mismas condiciones. Sin embargo, muchas de las API de números aleatorios seguras que se usan en la práctica no devuelven directamente el número aleatorio físico, sino que tienen una configuración híbrida: un CSPRNG / DRBG cuyo seed proviene de una fuente de entropía física.
¿Se puede distinguir un número pseudoaleatorio de uno real solo mirando la salida?
No se puede afirmar con certeza que una salida sea un número aleatorio real observando únicamente una secuencia finita de valores, porque siempre es posible construir un programa determinista que devuelva exactamente esa misma secuencia observada. Para distinguirlos, lo esencial no es el aspecto de la salida, sino confirmar la configuración del generador: qué algoritmo de generación se usa, de dónde proviene el seed, si se hace reseed, si existe verificación de la fuente de entropía (evaluación de min-entropy o health test) y qué API se está utilizando.
¿Se puede decir que un generador produce números aleatorios reales solo porque pasa las pruebas estadísticas?
No se puede decir eso. El papel de las pruebas estadísticas se parece más a la detección de defectos que a una demostración. La propia NIST SP 800-22 señala que las pruebas estadísticas son solo un primer paso y que, por sí solas, de ninguna manera demuestran la validez del generador. Un CSPRNG bien diseñado también pasa estas pruebas sin problema, y a la inversa, incluso una fuente de números aleatorios físicos puede fallarlas por un sesgo del sensor o una avería. La posición correcta es esta: pasarlas significa que no se ven defectos evidentes, por ahora; no pasarlas indica que hay una alta probabilidad de que algo esté mal.
¿Qué API de números aleatorios se debe usar para fines de seguridad?
Para usos como claves, tokens, nonces o ID de sesión, lo básico es usar la API de números aleatorios segura que proporciona el sistema operativo o el lenguaje. En concreto: en Windows nativo, BCryptGenRandom; en .NET, System.Security.Cryptography.RandomNumberGenerator; en Linux, getrandom(); en Python, el módulo secrets; y en Java, SecureRandom. Se debe evitar tanto una implementación propia con seed basado en la hora actual o el ID de proceso, como reutilizar para fines de seguridad las API de la familia random.

Perfil del autor

Página de presentación del autor del artículo.

Go Komura

Representante de KomuraSoft LLC

Especializado en desarrollo de software para Windows, consultoría técnica e investigación de fallos, sobre todo en proyectos con sistemas existentes y errores difíciles de reproducir.

Volver al blog