stringtranslate.com

Estiramiento de claves

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]

Proceso

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]

Basado en hash

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]

Fuerza y ​​tiempo

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.

Historia

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]

Algunos sistemas que utilizan estiramiento de clave

Véase también

Referencias

  1. ^ abc 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 . Apuntes de clase en informática. Vol. 1396. Springer. págs. 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" (PDF) .
  3. ^ McMillan, Troy (7 de julio de 2022). Guía de certificación CAS-004 de CompTIA Advanced Security Practitioner (CASP+). Certificación de TI de Pearson. ISBN 978-0-13-734870-1.
  4. ^ crypt(3)  –  Manual de funciones de la biblioteca de FreeBSD
  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 coste para etiquetas RFID" (PDF) . Archivado desde el original (PDF) el 19 de marzo de 2012.
  7. ^ "Los nuevos FPGAs Spartan-3 de 90 nm de Xilinx redefinen el panorama de los semiconductores (0333) : Comunicados de prensa de Xilinx". Archivado desde el 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 1000 iteraciones cuesta 2002 hashes SHA-1 a una velocidad de 5164,9 kH/s, lo que equivale a 10 340 129 800 hashes SHA-1 por segundo.
  9. ^ Morris, Robert; Thompson, Ken (3 de abril de 1978). "Seguridad de contraseñas: un caso clínico". Bell Laboratories . Archivado desde el original el 22 de marzo de 2003. Consultado el 9 de mayo de 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: multiple names: authors list (link)
  12. ^ Percival, Colin (2009). scrypt: Una nueva función de derivación de claves. BSDCan 2009. Archivado desde el original el 29 de junio de 2024.
  13. ^ Competencia de hash de contraseñas
  14. ^ "Formato 7z".
  15. ^ KBDF4
  16. ^ KeePassXC: cómo crear su primera base de datos
  17. ^ Drepper, Ulrich. "Cifrado Unix usando SHA-256 y SHA-512".
  18. ^ RFC 4880