Articulo de referencia

Estiramientos clave

En criptografía , las técnicas de estiramiento de clave se utilizan para hacer que una clave potencialmente débil , normalmente una contraseña o frase de contraseña , sea más se...

En criptografía , las técnicas de estiramiento de clave se utilizan para hacer que una clave potencialmente débil , normalmente una contraseña o frase de contraseña , sea más segura frente a un ataque de fuerza bruta , aumentando los recursos (tiempo y posiblemente espacio) necesarios 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 su descifrado , y el estiramiento de clave pretende dificultar dichos ataques al complicar el paso básico de probar una única contraseña candidata. El estiramiento de clave también mejora la seguridad en algunas aplicaciones del mundo real donde la longitud de la clave está restringida, al simular una longitud de clave mayor desde la perspectiva de un atacante de fuerza bruta. [ 1 ]

Existen varias formas de realizar el estiramiento de claves. Una de ellas consiste en aplicar repetidamente una función hash criptográfica o un cifrado por bloques en un bucle. Por ejemplo, en aplicaciones donde la clave se utiliza para un cifrado , se puede modificar la programación de la clave en el cifrado para que su ejecución requiera un tiempo específico. Otra forma consiste en utilizar funciones hash criptográficas con altos requisitos de memoria; estas pueden ser eficaces para frustrar ataques de adversarios con recursos de memoria limitados. [ 2 ]

Proceso

Los algoritmos de estiramiento de clave dependen de un algoritmo que recibe una clave de entrada y luego invierte un esfuerzo considerable para generar un cifrado extendido (llamado clave mejorada ) que imita la aleatoriedad y una longitud de clave mayor. El algoritmo no debe tener atajos conocidos, por lo que la forma más eficiente de relacionar la entrada y el cifrado es repetir el propio algoritmo de estiramiento de clave. Esto obliga a los atacantes de fuerza bruta a invertir el mismo esfuerzo en cada intento. Si este esfuerzo adicional se compara con una búsqueda de clave por fuerza bruta de todas las claves con una longitud determinada, entonces la clave de entrada puede describirse como extendida por esa misma longitud. [ 1 ]

El estiramiento de teclas deja al atacante con dos opciones:

  • Intentar posibles combinaciones de la clave mejorada, pero esto es inviable si la clave mejorada es suficientemente larga e impredecible (es decir, el algoritmo imita la aleatoriedad lo suficientemente bien como para que el atacante deba probar todo el espacio de claves extendidas) [ 3 ].
  • Intentar posibles combinaciones de la clave inicial más débil, comenzando potencialmente con un ataque de diccionario si la clave inicial es una contraseña o frase de contraseña, pero el esfuerzo adicional del atacante en cada intento podría hacer que el ataque no sea rentable si el mayor costo computacional y el consumo de memoria superan la ganancia esperada.

Si el atacante utiliza el mismo tipo de hardware que el usuario, cada intento tardará un tiempo similar en procesarse (por ejemplo, un segundo). Incluso si el atacante dispone de muchos más recursos informáticos que el usuario, el estiramiento de claves lo ralentizará 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 estiramiento una vez, al introducir la contraseña, mientras que el atacante debe calcularla para cada intento.

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 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 está protegido contra ciertas compensaciones de tiempo y memoria, como el desarrollo de tablas arcoíris para atacar múltiples instancias del espacio de claves mejoradas en paralelo (lo que equivale a un atajo para repetir el algoritmo). Por esta razón, el estiramiento de claves se suele combinar con el salting . [ 1 ]

Basado en hash

Muchas bibliotecas proporcionan funciones que realizan el estiramiento de claves como parte de su función; véase crypt(3) para un ejemplo. [ 4 ] PBKDF2 se utiliza para generar una clave de cifrado a partir de una contraseña, y no necesariamente para la autenticación de contraseñas. PBKDF2 puede utilizarse para ambos fines si el número de bits de salida es menor o igual al algoritmo de hash interno utilizado en PBKDF2, que suele ser SHA-2 (hasta 512 bits), o utilizarse como clave de cifrado para cifrar datos estáticos. [ 5 ]

Fuerza y ​​tiempo

Estos ejemplos parten de la base de que una CPU doméstica puede realizar aproximadamente 65 000 hashes SHA-1 en un segundo. Por lo tanto, un programa que utilice estiramiento de claves puede emplear 65 000 rondas de hashes y retrasar al usuario como máximo un segundo.

Normalmente, probar una contraseña o frase de contraseña de prueba requiere una operación de hash. Sin embargo, si se utiliza el estiramiento de clave, el atacante debe calcular una clave reforzada para cada clave que pruebe, lo que significa que hay 65 000 hashes que calcular por prueba. Esto aumenta la carga de trabajo del atacante en un factor de 65 000, aproximadamente 2¹⁶ , lo que significa que la clave reforzada equivale a unos 16 bits adicionales de seguridad.

La ley de Moore afirma que la velocidad de las computadoras se duplica aproximadamente cada 2 años. Bajo esta suposición, cada 2 años un bit más de fuerza de clave es plausiblemente vulnerable a un ataque de fuerza bruta. Esto implica que 16 bits adicionales de fuerza equivalen a unos 16 × 2 = 32 años más de descifrado, pero también significa que el número de rondas de estiramiento de clave que utiliza un sistema debería 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 y consistente probablemente no actualizarán el número de iteraciones utilizadas en el estiramiento de clave. En tal caso, el diseñador debería considerar cuánto tiempo desea que el sistema de derivación de claves permanezca sin cambios y debería elegir un número apropiado de hashes para la vida útil del sistema).

Las funciones hash limitadas por la 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 descifrador de hardware completamente desplegado por unos 5000 dólares. Un diseño de este tipo, con una frecuencia de reloj de 100 MHz , puede probar unas 300 000 claves por segundo. El atacante puede elegir libremente un buen compromiso precio/velocidad, por ejemplo, un diseño de 150 000 claves por segundo por 2500 dólares. El estiramiento de claves sigue ralentizando al atacante en esta situación; 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. 

De manera similar, las GPU modernas para consumidores pueden acelerar considerablemente el proceso de hash. Por ejemplo, en una prueba de rendimiento, una Nvidia RTX 2080 SUPER FE calcula más de 10 mil millones de hashes SHA1 por segundo. [ 8 ]

Para protegerse contra los ataques basados ​​en hardware, se han desarrollado funciones criptográficas que dependen de la memoria . Estas funciones acceden a grandes cantidades de memoria, lo que hace que el almacenamiento en caché sea ineficaz. Dado que grandes cantidades de memoria de baja latencia son costosas, se desincentiva a los posibles atacantes a realizar este tipo de ataques.

Historia

La primera función de derivación de clave basada en contraseña deliberadamente lenta, "CRYPT", fue descrita en 1978 por Robert Morris para cifrar contraseñas de Unix . [ 9 ] Utilizaba un conteo de iteraciones de 25, un salt de 12 bits y una variante de DES como subfunción. (Se evitó DES propiamente dicho 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 conteo de iteraciones, diseñado para la era del PDP-11 , es demasiado bajo, 12 bits de salt es un inconveniente pero no detiene los ataques de diccionario precalculados, y el límite de ocho caracteres impide el uso de frases de contraseña más seguras .

Las funciones modernas de derivación de claves basadas en contraseñas, como PBKDF2 , utilizan una función hash criptográfica, como SHA-2 , una sal más larga (por ejemplo, de 64 bits) y un alto número de iteraciones. El Instituto Nacional de Estándares y Tecnología de EE. UU. (NIST) 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 requiere 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 celebró un concurso de hash de contraseñas para seleccionar un estándar de estiramiento de clave mejorado que resistiera ataques de procesadores gráficos y hardware especializado. El ganador, Argon2 , fue seleccionado el 1 de julio de 2015. [ 13 ]

Algunos sistemas que utilizan estiramiento de teclas

Véase también

Referencias

  1. 1 2 3 Kelsey, John; Schneier, Bruce; Hall, Chris; Wagner, David A. (1997). "Aplicaciones seguras de claves de baja entropía". En Okamoto, Eiji; Davida, George I.; Mambo, Masahiro (eds.). Seguridad de la información, Primer Taller Internacional, ISW '97, Tatsunokuchi, Japón, 17-19 de septiembre de 1997, Actas . Lecture Notes in Computer Science. Vol.  1396. Springer. pp. 121–134 . doi : 10.1007/BFb0030415 . ISBN  978-3-540-64382-1.
  2. Reinhold, Arnold (15 de julio de 1999). "HEKS: Una familia de algoritmos de estiramiento de claves" .
  3. McMillan, Troy (2022-07-07). Guía de certificación CompTIA Advanced Security Practitioner (CASP+) CAS-004 . Pearson IT Certification. ISBN 978-0-13-734870-1.
  4. Manual de funciones de la biblioteca de FreeBSDcrypt(3)  
  5. Moriarty, Kathleen (2017). "PKCS #5: Especificación de criptografía basada en contraseñas, versión 2.1" . 
  6. O'Neill, Máire. "Arquitectura de función hash SHA-1 de bajo costo para etiquetas RFID" (PDF) . Archivado del original (PDF) el 19 de marzo de 2012.
  7. "Los nuevos FPGA Xilinx Spartan-3 de 90 nm transforman el panorama de los semiconductores (0333) : comunicados de prensa de Xilinx" . Archivado del original el 16 de julio de 2011. Consultado el 8 de agosto de 2010 . 
  8. https://gist.github.com/epixoip/47098d25f171ec1808b519615be1b90d , PBKDF2-HMAC-SHA1 con 1.000 iteraciones cuesta 2.002 hashes SHA-1 a una velocidad de 5.164,9 kH/s, lo que equivale a 10.340.129.800 hashes SHA-1 por segundo.
  9. Morris, Robert; Thompson, Ken (1978-04-03). "Seguridad de contraseñas: un estudio de caso" . Bell Laboratories . Archivado del original el 22-03-2003 . Recuperado el 09-05-2011 .
  10. Grassi Paul A. (junio de 2017). SP 800-63B-3 – Directrices de identidad digital, autenticación y gestión del ciclo de vida . NIST. doi : 10.6028/NIST.SP.800-63b .
  11. Meltem Sönmez Turan, Elaine Barker, William Burr y Lily Chen (diciembre de 2010). SP 800-132 – Recomendación para la derivación de claves basada en contraseñas, parte 1: aplicaciones de almacenamiento . NIST. doi : 10.6028/NIST.SP.800-132 .{{cite book}}: CS1 maint: varios nombres: lista de autores ( enlace )
  12. Percival, Colin (2009). scrypt: Una nueva función de derivación de claves . BSDCan 2009. Archivado del original el 29 de junio de 2024.
  13. Concurso de Hashing de Contraseñas
  14. "Formato 7z" .
  15. KBDF 4
  16. KeePassXC: Creación de tu primera base de datos
  17. Drepper, Ulrich. "Criptografía Unix usando SHA-256 y SHA-512" .
  18. RFC 4880