CSPRNG: ¡los algoritmos aleatorios también necesitan seguridad!
9 de febrero de 2023
0 minutos de lecturaSi 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:
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.
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:
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.



