En criptografía , las técnicas de estiramiento de claves se utilizan para hacer que una clave posiblemente débil, normalmente una contraseña o frase de contraseña , sea más segura contra un ataque de fuerza bruta al aumentar los recursos (tiempo y posiblemente espacio) que se necesitan para probar cada clave posible. Las contraseñas o frases de contraseña creadas por humanos suelen ser lo suficientemente cortas o predecibles como para permitir el descifrado de contraseñas , y el estiramiento de claves tiene como objetivo dificultar dichos ataques al complicar un paso básico de probar una única contraseña candidata. El estiramiento de claves también mejora la seguridad en algunas aplicaciones del mundo real donde se ha restringido la longitud de la clave, al imitar una longitud de clave más larga desde la perspectiva de un atacante de fuerza bruta. [1]
Existen varias formas de realizar la ampliación de claves. Una de ellas es aplicar una función hash criptográfica o un cifrado de bloque repetidamente en un bucle. Por ejemplo, en aplicaciones en las que se utiliza la clave para un cifrado , el programa de claves en el cifrado puede modificarse para que tarde un tiempo específico en ejecutarse. Otra forma es utilizar funciones hash criptográficas que tengan grandes requisitos de memoria; estas pueden ser eficaces para frustrar los ataques de adversarios limitados por la memoria. [2]
Los algoritmos de estiramiento de claves dependen de un algoritmo que recibe una clave de entrada y luego dedica un esfuerzo considerable para generar un cifrado estirado (llamado clave mejorada [ cita requerida ] ) que imita la aleatoriedad y una longitud de clave más larga. El algoritmo no debe tener un atajo conocido, por lo que la forma más eficiente de relacionar la entrada y el cifrado es repetir el algoritmo de estiramiento de clave en sí. Esto obliga a los atacantes de fuerza bruta a dedicar el mismo esfuerzo en cada intento. Si este esfuerzo adicional se compara con una búsqueda de claves por fuerza bruta de todas las claves con una cierta longitud de clave, entonces la clave de entrada puede describirse como estirada por esa misma longitud. [1]
El estiramiento de claves deja al atacante con dos opciones:
Si el atacante utiliza la misma clase de hardware que el usuario, cada intento de intento tardará en procesarse la misma cantidad de tiempo que el usuario (por ejemplo, un segundo). Incluso si el atacante tiene muchos más recursos informáticos que el usuario, la ampliación de la clave seguirá frenando al atacante sin afectar gravemente la usabilidad del sistema para ningún usuario legítimo. Esto se debe a que el ordenador del usuario solo tiene que calcular la función de ampliación una vez que el usuario introduce su contraseña, mientras que el atacante debe calcularla para cada intento de intento de intento durante el ataque.
Este proceso no altera la entropía del espacio de claves original. El algoritmo de estiramiento de claves es determinista , lo que permite que una entrada débil genere siempre la misma clave mejorada, pero, por lo tanto, limita la clave mejorada a no más combinaciones posibles que el espacio de claves de entrada. En consecuencia, este ataque sigue siendo vulnerable si no se protege contra ciertas compensaciones de tiempo-memoria, como el desarrollo de tablas arco iris para apuntar a múltiples instancias del espacio de claves mejorado en paralelo (efectivamente, un atajo para repetir el algoritmo). Por esta razón, el estiramiento de claves a menudo se combina con el salting . [1]
Muchas bibliotecas proporcionan funciones que realizan la ampliación de claves como parte de su función; consulte crypt(3) para ver un ejemplo. [4] PBKDF2 sirve para generar una clave de cifrado a partir de una contraseña, y no necesariamente para la autenticación de contraseñas. PBKDF2 se puede utilizar para ambos fines si el número de bits de salida es menor o igual que el algoritmo de hash interno utilizado en PBKDF2, que suele ser SHA-2 (hasta 512 bits), o se puede utilizar como una clave de cifrado para cifrar datos estáticos. [5]
Estos ejemplos suponen que una CPU de consumidor puede realizar alrededor de 65.000 hashes SHA-1 en un segundo. Por lo tanto, un programa que utiliza la ampliación de claves puede utilizar 65.000 rondas de hashes y retrasar al usuario durante un segundo como máximo.
Para probar una contraseña o frase de contraseña de prueba, normalmente se necesita una operación de hash. Pero si se utilizó la ampliación de clave, el atacante debe calcular una clave reforzada para cada clave que pruebe, lo que significa que hay 65.000 hashes para calcular por prueba. Esto aumenta la carga de trabajo del atacante en un factor de 65.000, aproximadamente 2 16 , lo que significa que la clave mejorada vale unos 16 bits adicionales en cuanto a fuerza de clave.
La ley de Moore afirma que la velocidad de la computadora se duplica aproximadamente cada 2 años. Bajo este supuesto, cada 2 años un bit más de fuerza de clave es plausiblemente susceptible de ser descifrado por la fuerza bruta. Esto implica que 16 bits adicionales de fuerza valen aproximadamente 16×2 = 32 años después de ser descifrados, pero también significa que la cantidad de rondas de estiramiento de clave que utiliza un sistema debe duplicarse aproximadamente cada 2 años para mantener el mismo nivel de seguridad (dado que la mayoría de las claves son más seguras de lo necesario, los sistemas que requieren una generación de claves determinista consistente probablemente no actualizarán la cantidad de iteraciones utilizadas en el estiramiento de claves. En tal caso, el diseñador debe tener en cuenta cuánto tiempo desea que el sistema de derivación de claves permanezca inalterado y debe elegir una cantidad apropiada de hashes para la vida útil del sistema).
Las funciones hash limitadas por CPU siguen siendo vulnerables a las implementaciones de hardware . Existen implementaciones de SHA-1 que utilizan tan solo 5000 puertas y 400 ciclos de reloj. [6] Con FPGAs de varios millones de puertas que cuestan menos de 100 dólares, [7] un atacante puede construir un cracker de hardware completamente desenrollado por unos 5000 dólares. [ cita requerida ] Un diseño de este tipo, con una velocidad de reloj de 100 MHz, puede probar unas 300 000 claves por segundo. El atacante es libre de elegir un buen compromiso precio/velocidad, por ejemplo, un diseño de 150 000 claves por segundo por 2500 dólares. [ cita requerida ] El estiramiento de claves todavía ralentiza al atacante en una situación así; un diseño de 5000 dólares que ataque un hash SHA-1 directo podría probar 300 000 ÷ 2 16 ≈ 4,578 claves por segundo. [ cita requerida ]
De manera similar, las GPU de consumo modernas pueden acelerar considerablemente el hash. Por ejemplo, en una prueba comparativa, una Nvidia RTX 2080 SUPER FE calcula más de 10 mil millones de hashes SHA1 por segundo. [8]
Para defenderse del enfoque de hardware, se han desarrollado funciones criptográficas limitadas a la memoria . Estas funciones acceden a una gran cantidad de memoria de una manera que hace que el almacenamiento en caché sea ineficaz. Dado que grandes cantidades de memoria de baja latencia son costosas, los atacantes potenciales no se atreven a realizar este tipo de ataques.
La primera función de derivación de claves basada en contraseñas deliberadamente lenta, "CRYPT", fue descrita en 1978 por Robert Morris para cifrar contraseñas Unix . [9] Utilizaba un recuento de iteraciones de 25, una sal de 12 bits y una variante de DES como subfunción. (DES propiamente dicho se evitó en un intento de frustrar los ataques que utilizaban hardware DES estándar). Las contraseñas estaban limitadas a un máximo de ocho caracteres ASCII . Si bien fue un gran avance para su época, CRYPT(3) ahora se considera inadecuado. El recuento de iteraciones, diseñado para la era PDP-11 , es demasiado bajo, 12 bits de sal son un inconveniente pero no detienen los ataques de diccionario precalculados, y el límite de ocho caracteres impide el uso de frases de contraseña más fuertes .
Las funciones de derivación de claves basadas en contraseñas modernas, como PBKDF2 , utilizan un hash criptográfico, como SHA-2 , una sal más larga (por ejemplo, 64 bits) y un alto número de iteraciones. El Instituto Nacional de Estándares y Tecnología (NIST) de EE. UU. recomienda un número mínimo de iteraciones de 10 000. [10] : 5.1.1.2 "Para claves especialmente críticas, o para sistemas muy potentes o sistemas donde el rendimiento percibido por el usuario no es crítico, un número de iteraciones de 10 000 000 puede ser apropiado". [11] : 5.2
En 2009, se introdujo un algoritmo de fortalecimiento de claves que consume mucha memoria, scrypt , con la intención de limitar el uso de hardware personalizado y altamente paralelo para acelerar las pruebas de claves. [12]
En 2013, se llevó a cabo una competencia de hash de contraseñas para seleccionar un estándar de cifrado de claves mejorado que resistiera ataques de procesadores gráficos y hardware especial. El ganador, Argon2 , fue seleccionado el 1 de julio de 2015. [13]
{{cite book}}
: CS1 maint: multiple names: authors list (link)