cryptography security encryption devops

Conceptos avanzados de criptografía: de CSPRNG a la confidencialidad directa

Una exploración de los bloques de construcción criptográficos modernos, incluidos CSPRNG, AEAD, funciones de derivación de claves y los principios de la confidencialidad directa perfecta.

Conceptos avanzados de criptografía: de CSPRNG a la confidencialidad directa

En una era de filtraciones de datos ubicuas y sofisticada vigilancia patrocinada por estados, el papel de la criptografía ha pasado de ser una disciplina académica de nicho a la base de la economía digital. Si bien muchos desarrolladores están familiarizados con conceptos básicos como el "hashing" o el "cifrado simétrico", la seguridad de un sistema en el mundo real a menudo depende de primitivas más avanzadas y matizadas.

En esta guía, exploraremos los componentes críticos que hacen posibles los protocolos criptográficos modernos como TLS 1.3 y Signal: desde la generación de aleatoriedad hasta la garantía de que los secretos de hoy permanezcan seguros incluso si las claves de mañana se ven comprometidas.


1. El fundamento de la aleatoriedad: CSPRNG

Cada operación criptográfica comienza con un secreto, y cada secreto comienza con aleatoriedad. Sin embargo, en el mundo de las computadoras, que son fundamentalmente máquinas deterministas, la aleatoriedad verdadera es sorprendentemente difícil de encontrar.

¿Qué es un CSPRNG?

Un Generador de Números Pseudoaleatorios Criptográficamente Seguro (CSPRNG) es un algoritmo especializado diseñado para producir secuencias de números que son indistinguibles del ruido aleatorio real. A diferencia de los PRNG estándar (como Math.random() en JavaScript), un CSPRNG debe cumplir con dos requisitos críticos:

  1. Prueba del siguiente bit: Dados los primeros k bits de una secuencia, un atacante con potencia de cálculo ilimitada no debería poder predecir el bit $(k+1)$ con una probabilidad significativamente mayor al 50%.
  2. Extensiones de compromiso de estado: Si el estado interno del generador se ve comprometido, debería ser imposible reconstruir salidas aleatorias anteriores (resistencia al retroceso) o predecir salidas futuras (resistencia a la predicción, siempre que se añada nueva entropía).

La fuente de entropía

Un CSPRNG es tan bueno como su fuente de entropía. Los sistemas operativos modernos recopilan "ruido" de eventos de hardware, como los tiempos del teclado, los movimientos del mouse, las interrupciones de E/S del disco y el ruido térmico, para sembrar el generador. En Linux, esto es manejado por /dev/urandom.


2. Cifrado autenticado con datos asociados (AEAD)

Durante décadas, a los desarrolladores se les enseñó a cifrar para la confidencialidad y usar un MAC (como HMAC) para la integridad. Este enfoque de "Cifrar luego de MAC" es seguro pero propenso a errores de implementación.

El auge de AEAD

AEAD (Authenticated Encryption with Associated Data) simplifica esto al proporcionar confidencialidad e integridad en una sola primitiva criptográfica. Cuando utiliza un modo AEAD como AES-GCM o ChaCha20-Poly1305, el algoritmo produce:

  1. Texto cifrado: Los datos cifrados.
  2. Etiqueta de autenticación: Una suma de comprobación criptográfica que demuestra que el texto cifrado no ha sido manipulado.

Datos asociados (AD)

La parte "AD" le permite autenticar datos que no están cifrados. Por ejemplo, en un paquete de red, el encabezado (que contiene la IP de destino) debe permanecer en texto plano para que los enrutadores puedan leerlo, pero debe autenticarse para que un atacante no pueda cambiar el destino sin ser detectado.


3. Funciones de derivación de claves (KDF)

Nunca debe usar una contraseña sin procesar como clave de cifrado. Los humanos eligen contraseñas predecibles, mientras que los algoritmos criptográficos requieren cadenas de bits de alta entropía y distribuidas uniformemente.

¿Qué hace una KDF?

Una Función de derivación de claves (KDF) toma una fuente de entropía (como una contraseña o un secreto compartido de un intercambio de claves) y "estira" o "deriva" una o más claves criptográficamente fuertes a partir de ella.

Estándares modernos de KDF

  • PBKDF2: Un estándar antiguo que utiliza hashing repetido para ralentizar los ataques de fuerza bruta.
  • Argon2: El ganador de la Password Hashing Competition (PHC), diseñado para ser resistente al descifrado basado en GPU y ASIC.
  • HKDF (KDF basado en HMAC): Ampliamente utilizado en protocolos como TLS 1.3 para derivar múltiples claves independientes (por ejemplo, una clave de cifrado y una clave de autenticación) a partir de un único secreto compartido.

4. Intercambio de claves efímeras y confidencialidad directa

Uno de los conceptos más potentes de la criptografía moderna es la Confidencialidad Directa Perfecta (PFS).

El problema con las claves estáticas

En versiones anteriores de SSL, el servidor utilizaba una clave privada RSA estática para intercambiar claves de sesión. Si un atacante grababa todo su tráfico cifrado durante años y luego lograba robar la clave privada del servidor, podía volver atrás y descifrar todo el tráfico histórico que había recopilado.

La solución: Intercambio de claves efímeras

Los protocolos modernos utilizan Diffie-Hellman efímero (DHE) o Diffie-Hellman de curva elíptica (ECDHE).

  • Efímero significa que las claves son temporales; se genera un par de claves nuevo y único para cada sesión.
  • Una vez finalizada la sesión, las claves se eliminan de la memoria.

Lograr la confidencialidad directa

Debido a que la clave de identidad a largo plazo del servidor solo se usa para firmar el intercambio (demostrando la identidad del servidor) en lugar de cifrar las claves de sesión, comprometer la clave a largo plazo no ayuda a un atacante a descifrar el tráfico pasado. Este es el estándar de oro para la privacidad.


5. Resumen: Construir un sistema seguro

Para construir una aplicación moderna y segura, debe seguir estos patrones arquitectónicos:

  1. Genere secretos utilizando un CSPRNG proporcionado por el sistema (por ejemplo, crypto.getRandomValues() en el navegador o crypto.randomBytes() en Node.js).
  2. Almacene contraseñas usando Argon2 o Scrypt.
  3. Proteja los datos en reposo utilizando un modo AEAD como AES-256-GCM.
  4. Proteja los datos en tránsito utilizando TLS 1.3 con ECDHE para confidencialidad directa.
  5. Derive subclaves utilizando HKDF en lugar de reutilizar la misma clave maestra para diferentes propósitos.

Al comprender estos conceptos avanzados, va más allá de "marcar la casilla" de la seguridad y comienza a construir sistemas que son resistentes tanto a las amenazas actuales como a las vulnerabilidades futuras.