Inicio / Blog / La importancia de lo aleatorio

La importancia de lo aleatorio

Publicado el 25/11/2014, por Miguel Herrero (INCIBE)
Imagen de una ruleta de casino

Los números aleatorios son un elemento clave en múltiples procesos de la vida digital. Estos se utilizan no sólo en aplicaciones con gran componente de aleatoriedad como puede ser el juego online, sino que también tienen múltiples aplicaciones en el mundo de la ciberseguridad. En algunos sistemas criptográficos la seguridad depende de algo únicamente conocido por el personal autorizado pero impredecible para los atacantes, tal y como pasa con los sistemas de token electrónico.

En estos sistemas se añade un segundo factor de seguridad siendo necesario no sólo el “algo que sé”, la contraseña, sino también un “algo que tengo”, un número. Para asegurar la robustez del sistema, este número tiene un tiempo de vida muy corto, en ocasiones de menos 60 segundos, y normalmente se genera a partir del reloj del token y una “semilla” aleatoria que viene cargada en el token.

Imagen de un token SecureID

- Token SecurID de RSA-

 Así pues, uno de los pilares de la seguridad de estos sistemas es la aleatoriedad de la “semilla” que se carga en el token y que es la que genera el número necesario para autenticarse en el sistema. Si la semilla se pudiera predecir sería sencillo generar el número del token y por tanto más fácil comprometer el sistema.

Para medir la incertidumbre de una fuente de información se utiliza la Entropía de Shannon (o simplemente entropía). Un sistema con baja entropía es más predecible que un sistema con alta entropía. Es conocido que un bit puede contener dos valores. Si ambos valores fueran equiprobables, un sistema de dos bits tendría una entropía de 2. Sin embargo, si existiera una condición por la cual el conocer uno de los dos bits diera información del otro, la entropía del sistema sería mucho menor.

Aplicando estos conceptos a la generación de números aleatorios que se utilizan en criptografía, si el conocer parte de los números previamente generados me proporcionara información de los números que se van a generar, la entropía del sistema será menor. Por tanto, un generador de números aleatorios con una fuente pobre de entropía producirá números aleatorios de baja calidad y más predecibles.

Generación de números aleatorios.

Actualmente existen dos tipos de generadores de números aleatorios. Por un lado los generadores de números aleatorios (RNG) se basan en la medición de un elemento físico como el ruido térmico o algún fenómeno cuántico, que se supone es aleatorio y se compensa posteriormente el sesgo de la medición.

Por otro lado existen los Generadores de números pseudo-aleatorios (PRNG), que son algoritmos deterministas que, a partir de un valor inicial (llamado semilla) son capaces de generar secuencias de números con buena aleatoriedad. Entre los PRNG existe una variedad llamada PRNG criptográficamente seguros (CPRNG) con propiedades adecuadas para su uso en criptografía.

El uso de uno u otro tipo depende del sistema y de la velocidad necesaria de generación de los números aleatorios. Los RNG suelen bloquear su generación hasta que se ha generado la suficiente entropía como para que el número generado sea aleatorio. Por otro lado los PRNG tienen mayor capacidad de generación de números aleatorios pero tienden a reducir la entropía del sistema, siendo cada vez más predecibles.

Para evitar que los PRNG sean predecibles, periódicamente se regenera la entropía del sistema cambiando la semilla a un número generado por un RNG.

Un incidente relacionado: El robo de bitcoins de 2013.

Como pudiste leer en nuestra guía de Bitcoin: Una moneda criptográfica, a mediados de agosto 2013 surgió en los medios de comunicación un caso de robo de bitcoins que afectó a aquellos usuarios que disponían de un monedero generado a través de una aplicación ejecutada sobre un teléfono con sistema operativo Android. El algoritmo de curva elíptica utilizado para generar las claves privadas exige que los números aleatorios que se utilizan sean utilizados una única vez ya que de no ser así, las claves privadas pueden ser obtenidas. Estos números aleatorios reciben el nombre de nonce y son ampliamente utilizados en sistemas criptográficos para, entre otras utilidades, evitar los ataques de reinyección de tráfico.

Así pues, la pobre capacidad e implementación de la generación de números aleatorios de Android provocó la reutilización de los nonce utilizados en la generación de claves creando colisiones en las claves privadas de los usuarios. Esto permitió el robo masivo de monederos de bitcoins, mediante el acceso ilegítimo a los monederos pertenecientes a algunos usuarios que habían creado su monedero a través de su teléfono móvil. Con el acceso a los monederos se realizaron las transacciones fraudulentas de bitcoins.

Cómo mejorar la entropía de un sistema.

Los sistemas basados en Linux regeneran su entropía con eventos supuestamente aleatorios, como la entrada del teclado o el movimiento del ratón. La cantidad disponible de entropía se puede consultar con el siguiente comando:

# cat /proc/sys/kernel/random/entropy_avail

Observa que si se hace una lectura de /dev/random (el generador de números aleatorios de este tipo de sistemas) la entropía del sistema se reduce. Si la entropía del sistema se agota, el RNG se bloquea y no proporciona más datos hasta que se haya recolectado suficiente entropía para continuar la generación. Esto hace que el RNG no sea muy útil para aplicaciones reales que requieran grandes cantidades de números aleatorios (como pueden ser los generadores de claves de un solo uso para la recuperación de contraseñas o casinos online).

Para evitar el bloqueo de /dev/random y que por tanto no se generen más números aleatorios, lo que se suele hacer es utilizar la salida de /dev/random como semilla para el generador de números pseudoaleatorios disponible en /dev/urandom que no sufre del problema del bloqueo por ser números pseudoaleatorios.

Si se agotara la entropía del sistema, se continuaría con la generación de números aleatorios pero estos serían más susceptibles de ser predichos, perjudicando la seguridad del sistema que los utilice. Para evitar que esto pase periódicamente se genera una nueva semilla y se reinicia el proceso de generación de números pseudoaleatorios de /dev/urandom.

En diciembre de 2013 el kernel de Linux 3.13 sufrió una actualización para mejorar la velocidad de generación de entropía. También cambió el proceso de regeneración de la semilla y se decidió que la semilla se regeneraría cuando se hubieran acumulado al menos el equivalente a 128 bits de entropía, en lugar de regenerar la semilla con menos bits como venía sucediendo en versiones anteriores.

La recolección de entropía puede mejorar instalando determinadas herramientas software (como las rng-tools) o algunos componentes hardware como pueden ser las llaves de entropía, que son una fuente adicional de entropía que mejora la calidad de los números aleatorios generados, o los decodificadores de radio (RTL-SDR) que también pueden ser usados para mejorar la entropía del sistema mediante el uso de rtl-entropy.

En sistemas Windows, la recolección de entropía puede hacerse pidiéndole al usuario que desplace el ratón durante un tiempo o escriba letras al azar, con una pantalla que podría ser similar a la que se muestra en la figura siguiente y utilizada en sistemas de gestión de contraseñas como keepass.

Imagen de generación de entropía de keepass

- Captación de entropía en Keepass-

Los sistemas móviles están algo más limitados a la recolección de entropía, al menos utilizando sus recursos hardware. En este tipo de sistemas se puede recurrir al ruido captado por los micrófonos, a la información de los acelerómetros o a pedir a un usuario que realice una fotografía para después utilizar una función hash criptográfica y, el resultado de esa operación, utilizarlo como semilla de un CPRNG. Este tipo de operaciones serán capaces de generar números aleatorios con la suficiente entropía como para que puedan ser utilizados con seguridad.

Etiquetas: