Skip to main content

CSPRNG: ¡los algoritmos aleatorios también necesitan seguridad!

Escrito por
feature snyk platform

9 de febrero de 2023

0 minutos de lectura

Si lanzo una moneda al aire, sé cuál será el resultado: cara o cruz. Sin embargo, no puedo predecir cuál de los dos será. Puedo adivinar con un 50 % de probabilidad, pero no puedo tener certeza absoluta. Si lanzara un dado, mi certeza sería menor (1 entre 6). Aun así, sé cuáles podrían ser los resultados.

Las computadoras son excelentes para muchas cosas, sobre todo para ser predecibles. Son deterministas, así que es imposible crear un número verdaderamente aleatorio. Sin embargo, podemos usar funciones para generar una aleatoriedad aproximada. Estas funciones se llaman generadores de números pseudoaleatorios. 

Veamos un poco de código:

import random

# Generate a random integer between 0 and 10
random_number = random.randint(0, 10)

print(random_number)

Este código generará un número aleatorio del 0 al 10 (incluye tanto el 0 como el 10 entre los posibles resultados). Es similar a lanzar la moneda y el dado de los ejemplos anteriores. Sabemos cuáles podrían ser los resultados; simplemente no podemos predecirlos con precisión.

Al trabajar con criptografía, queremos que la predictibilidad sea nula. Es decir, no queremos poder predecir nunca cuál será el resultado. Por ejemplo, supongamos que vamos a generar un token «aleatorio» para restablecer una contraseña. Podemos usar la hora actual para generar un valor hash. Cuando se muestra en la URL para restablecer la contraseña, parece aleatorio. Pero, en realidad, es predecible. Y un hacker podría aprovecharse de esto, especialmente si el código es de código abierto y está disponible para consultarlo.

import hashlib
import time

t = time.localtime()
current_time = time.strftime("%H:%M:%S", t)

MD5_hash = hashlib.md5(current_time.encode())

print(MD5_hash.hexdigest())

La aleatoriedad varía según el campo. En algunos casos, como en un casino, hacer girar la ruleta es aleatorio, aunque estadísticamente existe un 2,6 % de probabilidad de que el resultado se pueda «predecir». ¡En criptografía, eso no es suficiente!

Lo pseudoaleatorio no es seguro

Ya vimos los generadores de números pseudoaleatorios (PRNG), pero necesitamos algo mejor. Para que un número aleatorio sea seguro para usos criptográficos, debe ser impredecible, no repetirse y no presentar patrones. Queremos usar generadores de números pseudoaleatorios criptográficamente seguros (CSPRNG).

Un CSPRNG es un tipo de generador de números aleatorios diseñado específicamente para ser seguro en aplicaciones criptográficas. Estos generadores producen una secuencia de números aleatorios difícil de predecir o reproducir, incluso si se conocen el algoritmo y el valor semilla usados para inicializar el generador. Es decir, debe ser impredecible. Además, un CSPRNG debe poder generar una gran cantidad de números aleatorios sin que se repitan ni presenten patrones perceptibles en la secuencia.

Los CSPRNG se usan en diversas aplicaciones criptográficas, como la generación de claves, el hashing de contraseñas y el cifrado. También se usan en aplicaciones no criptográficas, por ejemplo, para generar ID únicos, tokens y claves de sesión.

CSPRNG y entropía

¿De dónde viene la «CS» de CSPRNG? De la entropía.

La entropía mide la aleatoriedad o incertidumbre de una fuente de datos. Es una parte fundamental de un CSPRNG. Los grupos de entropía son fuentes de datos aleatorios que se usan para inicializar los CSPRNG y volver a inicializarlos periódicamente, con el fin de garantizar que los números generados sigan siendo impredecibles.

Los CSPRNG pueden obtener datos de distintos tipos de grupos de entropía, y la implementación específica de un CSPRNG determina cuáles utiliza. Existen generadores de números aleatorios de hardware (HRNG), que son dispositivos físicos que aprovechan diversas fuentes de aleatoriedad, como el ruido electrónico, la desintegración radiactiva o el ruido atmosférico, para generar números aleatorios. Se consideran una buena fuente de entropía porque los procesos físicos usados para generar los números son difíciles de predecir o reproducir.

Algunos sistemas operativos ofrecen una fuente de entropía que se puede usar para inicializar los CSPRNG. Por ejemplo, los archivos /dev/random o /dev/urandom en sistemas Linux y similares a UNIX, y BCryptGenRandom() en Windows. Si usas Python, puedes usar os.urandom() para obtener bytes aleatorios mediante la fuente de aleatoriedad específica de tu sistema operativo.

Los CSPRNG también pueden recopilar entropía de distintas fuentes del entorno, como el tráfico de red, los movimientos del mouse o las pulsaciones del teclado. Estas fuentes pueden ser impredecibles y aportar una buena cantidad de entropía. Incluso puedes ir un paso más allá, como CloudFlare, ¡y usar lámparas de lava!

Ejemplo de CSPRNG

Siguiendo con Python, aquí tienes un ejemplo de cómo generar un token seguro para URL:

import secrets

print (secrets.token_urlsafe(16))

Esto generará un número pseudoaleatorio criptográficamente seguro. Podemos usarlo por diversos motivos, como generar un token para restablecer una contraseña. Este token se incluye en la URL y podría verse así: https://supersecurereset.io/forgot-password?token=3PDhWtzkTo9QGAq6mvLxYA

Más información sobre aleatoriedad y seguridad

La aleatoriedad insegura y la recuperación de contraseñas son solo una pequeña parte de la seguridad informática. Crear un entorno y una aplicación seguros requiere mucho más. No esperamos que nadie lo sepa todo; por eso existe Snyk Learn.

Snyk Learn es una excelente herramienta de aprendizaje con contenido de expertos en seguridad. Y lo mejor es que es gratis. Completamente gratis. No es una demostración y, por supuesto, no hay límite en la cantidad de lecciones que puedes tomar. 

Para obtener más información sobre la aleatoriedad y los métodos de recuperación de contraseñas, consulta estas dos lecciones:

Mejora tus habilidades de programación segura

Capacitación gratuita y de alta calidad en seguridad para desarrolladores, cuando y donde quieras.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.