481 / 736RNG

Random Number Generator

Generador de números aleatorios

Cuando una cartera crea un secreto nuevo, necesita números que nadie más pueda adivinar. Un generador de números aleatorios ayuda a obtenerlos, pero no todos sirven para proteger dinero.

Un Random Number Generator, o RNG, es un dispositivo o programa que produce valores numéricos. Una cartera necesita un generador criptográficamente seguro: conocer resultados anteriores o la hora de creación no debe permitir a un atacante predecir de forma viable el nuevo secreto. Importan la fuente de entropía, el algoritmo y cómo los utiliza la aplicación. Aquí, la entropía describe la incertidumbre que sigue teniendo un atacante sobre el resultado.

Imagina que una cartera derivara su secreto únicamente de la hora actual. El resultado podría parecer complicado, pero quien supiera cuándo la creaste tendría muchas menos posibilidades que probar. RFC 4086 advierte precisamente de estas entradas predecibles. Un generador adecuado para juegos o simulaciones puede no serlo para claves. Ni siquiera una buena distribución estadística demuestra por sí sola que sea seguro. [2]

Normalmente colaboran varias partes. Una fuente aporta incertidumbre, su salida se procesa cuando es necesario y un generador determinista criptográfico produce más valores a partir de un estado interno secreto. Determinista significa que el mismo estado interno y las mismas entradas producen el mismo resultado; por eso ese estado debe mantenerse en secreto. La aplicación los solicita mediante una interfaz del sistema. No hace falta una nueva medición física por cada bit devuelto. NIST SP 800-90C describe cómo combinar generadores de 90A con fuentes de 90B. [1]

Con BIP39, la base para recuperar la cartera se crea antes de que aparezca la primera palabra: el generador produce entre 128 y 256 bits de entropía inicial. Un bit es una unidad básica de información, un cero o un uno; lo importante es que el atacante no pueda predecir la secuencia. Se añade una suma de comprobación, un valor breve que ayuda a detectar algunos errores de transcripción, y el conjunto se convierte en palabras de recuperación. Puedes complementarlas con una passphrase, un texto secreto adicional. La función PBKDF2 deriva de esas entradas un seed de 512 bits: el valor secreto inicial del que se obtienen las claves de la cartera. Ni una salida más larga ni una suma de comprobación aportan la aleatoriedad que falta. Por eso no debes elegir tú las palabras de recuperación. [6]

El dispositivo debe detectar fallos como que una fuente de ruido empiece a repetir el mismo valor. NIST SP 800-90B exige comprobaciones al arrancar y durante el funcionamiento, además de gestionar los fallos detectados. No se puede ignorar un error y seguir presentando la salida como aleatoriedad verificada. Estas comprobaciones vigilan la fuente; no garantizan la seguridad de toda la cartera. [3]

Un generador determinista conserva un estado interno con el que calcula nuevos resultados. NIST SP 800-90A describe su creación, generación, incorporación de entropía nueva (reseed) y terminación. Si ese estado se filtra, volver a llamar al generador puede no restaurar la seguridad. Hace falta un procedimiento adecuado y entropía nueva que el atacante desconozca. Eso no le quita las claves que ya haya obtenido. [7]

No necesitas programar tu propio RNG. Conviene comprobar si la versión concreta de la cartera documenta cómo genera los valores y gestiona los errores. Las palabras «hardware» u «offline» no lo demuestran. Una revisión debe abarcar la fuente, el algoritmo, la inicialización y la interfaz de la aplicación. Incluso un secreto bien generado deja de estar protegido si después revelas su copia de seguridad. [1] [2]

Por defecto, getrandom() de Linux espera a que se inicialice urandom; con GRND_NONBLOCK puede devolver EAGAIN en vez de esperar. Tras la inicialización, las solicitudes a urandom de hasta 256 bytes tienen garantizada una lectura completa sin interrupciones por señales. Las solicitudes mayores no tienen esa garantía. El programa debe comprobar el estado devuelto y cuántos bytes ha recibido realmente. [4]

Web Crypto ofrece getRandomValues() para llenar un array de enteros compatible con valores criptográficamente fuertes. Por encima de 65536 bytes lanza QuotaExceededError. Para claves de algoritmos compatibles, la especificación recomienda generateKey(); no es un generador universal de carteras de Bitcoin. Usar bien la API tampoco demuestra que la página sea fiable: su código puede acceder al secreto generado. [5]

Para obtener la imagen más completa, lee esta entrada junto con Cryptographic Entropy, CSPRNG, Seed Generation, Brute Force Search Space. También enlazan con esta entrada CSPRNG, Deterministic RNG, True Random Number Generator, Seed Generation.

DOC · 001NIST SP 800-90C — RBG constructionsEspecificación DOC · 002RFC 4086 — Unpredictability and weak inputsEspecificación DOC · 003NIST SP 800-90B — Source health and failure handlingEspecificación DOC · 004Linux getrandom(2) — Initialization and return behaviorDocumentación DOC · 005W3C Web Crypto — getRandomValues and key generationEspecificación DOC · 006BIP39 — Initial entropy and mnemonic-to-seed derivationEspecificación DOC · 007NIST SP 800-90A Rev. 1 — DRBG lifecycle and reseedingEspecificación
Revisado: Fuentes primero · No es asesoramiento financiero