Ataques de temporización en código de nivel de aplicación
Aprenda cómo la temporización de la comparación de cadenas filtra secretos y cómo la comparación en tiempo constante lo evita.
Ataques de temporización en código de nivel de aplicación es una lección gratuita de Cryptology Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Cryptology Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Cryptology Academy incluye 4 lecciones en total.
Comparación de cadenas sin tiempo constante
El operador estándar de igualdad de cadenas en la mayoría de los lenguajes de programación termina en cuanto encuentra una discrepancia. La operación == de Python sobre objetos bytes, strcmp de C y String.equals de Java devuelven el resultado inmediatamente al encontrar el primer byte diferente. En una comparación normal de cadenas, esto es una optimización, pero al comparar valores secretos como etiquetas MAC o contraseñas, crea un canal lateral de temporización medible que filtra información.
Medición del tiempo de comparación de HMAC
Un atacante mide el tiempo que se tarda en comparar una etiqueta HMAC enviada con el valor correcto. Enviar un HMAC cuyo primer byte coincide correctamente tarda un poco más que enviar uno cuyo primer byte es incorrecto (se realiza una comparación de bytes adicional). Al enviar muchos valores con cada posible primer byte y medir los tiempos de respuesta, el atacante identifica el primer byte correcto. Este proceso se repite byte a byte hasta recuperar la etiqueta completa.
Precisión práctica de los ataques de temporización
Los ataques de temporización modernos en redes pueden resolver diferencias de tiempo de decenas a cientos de nanosegundos a través de Internet. Una comparación de HMAC de 32 bytes, en la que cada byte correcto añade aproximadamente entre 10 y 100 ns de tiempo de procesamiento, proporciona una señal medible si se realizan suficientes mediciones repetidas para promediar la variación de la red. En una red local, incluso las diferencias de un solo nanosegundo pueden explotarse con un muestreo estadístico suficiente.
Vulnerabilidad del operador == de Python
En Python, comparar etiquetas MAC con == no es seguro: si mac == submitted_mac devuelve True o False según la posición de la primera discrepancia. Un atacante que envíe miles de etiquetas manipuladas y mida los tiempos de respuesta puede recuperar la etiqueta esperada byte a byte. Esta vulnerabilidad ha aparecido en aplicaciones web en producción que implementaron incorrectamente la comparación de tokens de sesión o claves de API sin funciones de tiempo constante.
hmac.compare_digest en Python
hmac.compare_digest(a, b) de Python compara dos valores de bytes o cadenas en tiempo constante, por lo que tarda lo mismo independientemente de dónde se produzca la primera discrepancia. Está implementada en C para garantizar un comportamiento de tiempo constante incluso con la sobrecarga de interpretación del bytecode de Python. Utilice siempre hmac.compare_digest para comparar etiquetas MAC, tokens de sesión, claves de API o cualquier valor cuya información de temporización pudiera ser peligrosa.
CRYPTO_memcmp en OpenSSL
OpenSSL proporciona CRYPTO_memcmp(a, b, length) para comparar memoria en tiempo constante. A diferencia de memcmp, siempre procesa los length bytes, independientemente de que haya discrepancias tempranas. El valor devuelto es cero si los valores son iguales y distinto de cero si son diferentes. Es importante comparar siempre la longitud esperada completa: comparar valores de distinta longitud usando la longitud menor todavía puede filtrar información sobre la longitud. Utilice CRYPTO_memcmp en cualquier comparación crítica para la seguridad en código C/C++ que use OpenSSL.
Ataques de temporización contra RSA: Bleichenbacher
Los ataques de temporización van más allá de la comparación de cadenas. El ataque de Bleichenbacher de 2006 contra el descifrado RSA PKCS#1 v1.5 demostró un oráculo de temporización práctico contra implementaciones de SSL/TLS. El tiempo de la operación con la clave privada RSA variaba según si el valor descifrado tenía un relleno PKCS#1 válido. Al enviar miles de textos cifrados manipulados, los atacantes podían recuperar claves privadas RSA. Esto impulsó el uso de RSA-OAEP y de implementaciones RSA de tiempo constante.
Ataques de temporización de caché contra AES
Las implementaciones de AES que utilizan tablas de consulta (algo común por motivos de rendimiento) acceden a distintas entradas de la tabla según la clave y el texto plano. Los aciertos y fallos de caché crean diferencias de tiempo medibles que filtran información sobre las entradas de la tabla a las que se accedió. Este canal lateral puede revelar las claves AES. La defensa consiste en utilizar implementaciones de AES que no dependan de búsquedas en tablas, como las instrucciones de hardware AES-NI o las implementaciones de software bitslice.
Principios de implementación en tiempo constante
Para escribir código de tiempo constante, debe evitarse lo siguiente: las bifurcaciones condicionales sobre datos secretos (utilice selección sin ramas mediante máscaras), los patrones de acceso a memoria que dependan de datos secretos (evite las tablas de consulta indexadas por secretos) y cualquier operación cuya latencia dependa de valores secretos (por ejemplo, la división en algunos procesadores). Los compiladores pueden optimizar y eliminar construcciones de tiempo constante, por lo que podrían ser necesarios ensamblador o accesos a memoria volatile en secciones críticas.
AEAD elimina la comparación de MAC a nivel de aplicación
La mejor defensa contra los ataques de temporización en la comparación de MAC consiste en utilizar modos AEAD (GCM, ChaCha20-Poly1305) y delegar la verificación de la MAC en la biblioteca criptográfica. Las implementaciones de las bibliotecas realizan internamente la verificación en tiempo constante. Si utiliza AEAD correctamente (el descifrado falla ante cualquier manipulación y nunca se descifra antes de verificar la etiqueta), no necesita comparar etiquetas MAC en el código de la aplicación, lo que elimina por completo la vulnerabilidad de temporización.
Pruebas de vulnerabilidades de temporización
Las pruebas de vulnerabilidades de temporización requieren un análisis estadístico de las distribuciones de los tiempos de respuesta. Herramientas como tlsfuzzer, los scripts de prueba de ataques de temporización y el framework dudect ayudan a detectar diferencias de tiempo en implementaciones criptográficas. Una prueba t sobre muestras de tiempos de respuesta para entradas que deberían producir tiempos iguales puede revelar diferencias estadísticamente significativas. Es posible obtener falsos negativos; además de las pruebas, también es esencial revisar el código de tiempo constante.
Comparación en tiempo constante
¿Qué función de Python debe utilizarse para comparar de forma segura una etiqueta HMAC y evitar ataques de temporización?
Resumen de los ataques de temporización
Resumen de los ataques de temporización: la comparación de cadenas con salida anticipada filtra valores secretos byte a byte mediante diferencias en los tiempos de respuesta; estas diferencias pueden medirse a través de la red con suficientes muestras; utilice hmac.compare_digest en Python y CRYPTO_memcmp en OpenSSL para realizar comparaciones en tiempo constante; los ataques de temporización del relleno RSA pueden comprometer claves privadas (utilice RSA de tiempo constante y OAEP); los ataques de temporización mediante búsquedas en tablas de AES filtran bits de la clave (utilice AES-NI o implementaciones bitslice); y la verificación de las bibliotecas AEAD elimina la necesidad de comparar MAC a nivel de aplicación.
Preguntas frecuentes
¿La lección «Ataques de temporización en código de nivel de aplicación» es gratis?
Sí — el texto completo de «Ataques de temporización en código de nivel de aplicación» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Cryptology Academy, actualiza a CoddyKit PRO. El curso de Cryptology Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Ataques de temporización en código de nivel de aplicación»?
Aprenda cómo la temporización de la comparación de cadenas filtra secretos y cómo la comparación en tiempo constante lo evita. Practicas Cryptology Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Cryptology Academy?
No se requiere experiencia previa. Cryptology Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Ataques de temporización en código de nivel de aplicación»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Cryptology Academy?
Sí. Cada lección de Cryptology Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Ataques de padding oracle en detalle
- Ataques de replay y vulnerabilidades por reutilización de nonces
- Ataques de temporización en código de nivel de aplicación
- Principales patrones de uso incorrecto de la criptografía