stringtranslate.com

Función de derivación de clave

Ejemplo de una cadena de funciones de derivación de claves tal como se utiliza en el protocolo de señal . La salida de una función KDF es la entrada de la siguiente función KDF en la cadena.

En criptografía , una función de derivación de clave ( KDF ) es un algoritmo criptográfico que deriva una o más claves secretas a partir de un valor secreto, como una clave maestra, una contraseña o una frase de contraseña , utilizando una función pseudoaleatoria (que normalmente utiliza una función hash criptográfica o un cifrado de bloque ). [1] [2] [3] Las KDF se pueden utilizar para estirar claves en claves más largas o para obtener claves de un formato requerido, como convertir un elemento de grupo que es el resultado de un intercambio de claves Diffie-Hellman en una clave simétrica para su uso con AES . Las funciones hash criptográficas con clave son ejemplos populares de funciones pseudoaleatorias utilizadas para la derivación de claves. [4]

Historia

La primera [ cita requerida ] función de derivación de claves basada en contraseñas deliberadamente lenta (estiramiento de clave) se llamó " crypt " (o "crypt(3)" por su página de manual ), y fue inventada por Robert Morris en 1978. Encriptaba una constante (cero), utilizando los primeros 8 caracteres de la contraseña del usuario como clave, realizando 25 iteraciones de un algoritmo de cifrado DES modificado (en el que se utiliza un número de 12 bits leído del reloj de la computadora en tiempo real para perturbar los cálculos). El número de 64 bits resultante se codifica como 11 caracteres imprimibles y luego se almacena en el archivo de contraseñas de Unix . [5] Si bien fue un gran avance en su momento, los aumentos en las velocidades de los procesadores desde la era PDP-11 han hecho que los ataques de fuerza bruta contra crypt sean factibles, y los avances en almacenamiento han hecho que la sal de 12 bits sea inadecuada. El diseño de la función crypt también limita la contraseña del usuario a 8 caracteres, lo que limita el espacio de claves y hace imposible el uso de frases de contraseña seguras . [ cita requerida ]

Aunque un alto rendimiento es una propiedad deseable en las funciones hash de propósito general, ocurre lo contrario en las aplicaciones de seguridad de contraseñas en las que la defensa contra el descifrado por fuerza bruta es una preocupación principal. El creciente uso de hardware masivamente paralelo, como GPU, FPGA e incluso ASIC para el descifrado por fuerza bruta, ha hecho que la selección de un algoritmo adecuado sea aún más crítica porque el buen algoritmo no solo debe imponer una cierta cantidad de costo computacional no solo en las CPU, sino que también resista las ventajas de costo/rendimiento de las plataformas masivamente paralelas modernas para tales tareas. Se han diseñado varios algoritmos específicamente para este propósito, incluidos bcrypt , scrypt y, más recientemente, Lyra2 y Argon2 (este último fue el ganador de la competencia de hashes de contraseñas ). La filtración de datos a gran escala de Ashley Madison en la que los atacantes robaron aproximadamente 36 millones de hashes de contraseñas ilustró la importancia de la selección de algoritmos para proteger las contraseñas. Aunque se empleó bcrypt para proteger los hashes (lo que hizo que el descifrado por fuerza bruta a gran escala fuera costoso y demandara mucho tiempo), una parte significativa de las cuentas en los datos comprometidos también contenían un hash de contraseña basado en el rápido algoritmo de propósito general MD5 , que hizo posible descifrar más de 11 millones de contraseñas en cuestión de semanas. [6]

En junio de 2017, el Instituto Nacional de Estándares y Tecnología de los Estados Unidos (NIST) publicó una nueva revisión de sus pautas de autenticación digital, NIST SP 800-63B-3, [7] : 5.1.1.2,  que establece que: "Los verificadores DEBEN almacenar secretos memorizados [es decir, contraseñas] en una forma que sea resistente a ataques fuera de línea. Los secretos memorizados DEBEN ser salteados y codificados utilizando una función de derivación de clave unidireccional adecuada. Las funciones de derivación de clave toman una contraseña, una sal y un factor de costo como entradas y luego generan un hash de contraseña. Su propósito es hacer que cada intento de adivinación de contraseña por parte de un atacante que ha obtenido un archivo de hash de contraseña sea costoso y, por lo tanto, el costo de un ataque de adivinación sea alto o prohibitivo".

Las funciones de derivación de claves basadas en contraseñas modernas, como PBKDF2 , [2] se basan en un hash criptográfico reconocido, como SHA-2 , utilizan más sal (al menos 64 bits y elegidos aleatoriamente) y un alto número de iteraciones. El NIST recomienda un número mínimo de iteraciones de 10 000. [7] : 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". [8] : 5.2 

Derivación de claves

El uso original de un KDF es la derivación de claves, la generación de claves a partir de contraseñas o frases de contraseña secretas. Las variaciones de este tema incluyen:

Estiramiento clave y fortalecimiento clave

Las funciones de derivación de claves también se utilizan en aplicaciones para derivar claves de contraseñas o frases de contraseña secretas, que normalmente no tienen las propiedades deseadas para ser utilizadas directamente como claves criptográficas. En dichas aplicaciones, generalmente se recomienda que la función de derivación de claves sea deliberadamente lenta para frustrar los ataques de fuerza bruta o de diccionario sobre el valor de entrada de la contraseña o frase de contraseña.

Este uso puede expresarse como DK = KDF(clave, sal, iteraciones) , donde DK es la clave derivada, KDF es la función de derivación de la clave , clave es la clave o contraseña original, sal es un número aleatorio que actúa como sal criptográfica e iteraciones se refiere al número de iteraciones de una subfunción. La clave derivada se utiliza en lugar de la clave o contraseña original como clave del sistema. Los valores de la sal y el número de iteraciones (si no es fijo) se almacenan con la contraseña en hash o se envían como texto sin cifrar (sin cifrar) con un mensaje cifrado. [10]

La dificultad de un ataque de fuerza bruta aumenta con el número de iteraciones. Un límite práctico en el número de iteraciones es la falta de voluntad de los usuarios para tolerar un retraso perceptible al iniciar sesión en una computadora o ver un mensaje descifrado. El uso de sal impide que los atacantes calculen previamente un diccionario de claves derivadas. [10]

Un enfoque alternativo, llamado fortalecimiento de clave , extiende la clave con una sal aleatoria, pero luego (a diferencia del estiramiento de clave) elimina de forma segura la sal. [11] Esto obliga tanto al atacante como a los usuarios legítimos a realizar una búsqueda de fuerza bruta del valor de la sal. [12] Aunque el documento que introdujo el estiramiento de clave [13] se refirió a esta técnica anterior y eligió intencionalmente un nombre diferente, el término "fortalecimiento de clave" ahora se usa a menudo (posiblemente de manera incorrecta) para referirse al estiramiento de clave.

Hashing de contraseñas

A pesar de su uso original para la derivación de claves, las KDF son posiblemente más conocidas por su uso en el hash de contraseñas ( verificación de contraseñas por comparación de hash ), como se usa en el archivo passwd o el archivo de contraseñas shadow . Las funciones hash de contraseñas deberían ser relativamente caras de calcular en caso de ataques de fuerza bruta, y la expansión de claves de las KDF proporciona esta característica. [ cita requerida ] Los parámetros no secretos se denominan " sal " en este contexto.

En 2013 se anunció un concurso de hash de contraseñas para elegir un nuevo algoritmo estándar para el hash de contraseñas. El 20 de julio de 2015, el concurso finalizó y se anunció que Argon2 era el ganador final. Otros cuatro algoritmos recibieron un reconocimiento especial: Catena, Lyra2, Makwa y yescrypt. [14]

A partir de mayo de 2023, OWASP recomienda los siguientes KDF para el hash de contraseñas, enumerados en orden de prioridad: [15]

  1. Argon2id
  2. scrypt si Argon2id no está disponible
  3. bcrypt para sistemas heredados
  4. PBKDF2 si se requiere cumplimiento de FIPS-140

Referencias

  1. ^ Bezzi, Michele; et al. (2011). "Privacidad de datos". En Camenisch, enero; et al. (eds.). Gestión de privacidad e identidad de por vida . Saltador. págs. 185-186. ISBN 9783642203176.
  2. ^ ab B. Kaliski; A. Rusch (enero de 2017). K. Moriarty (ed.). PKCS #5: Especificación de criptografía basada en contraseñas versión 2.1. Grupo de trabajo de ingeniería de Internet (IETF). doi : 10.17487/RFC8018 . ISSN  2070-1721. RFC 8018. Informativo. Obsoleto RFC 2898. Actualizado por RFC 9579.
  3. ^ Chen, Lily (octubre de 2009). "NIST SP 800-108: Recomendación para la derivación de claves mediante funciones pseudoaleatorias". NIST.
  4. ^ Zdziarski, Jonathan (2012). Hackeo y seguridad de aplicaciones iOS: robo de datos, secuestro de software y cómo prevenirlo. O'Reilly Media. pp. 252–253. ISBN 9781449318741.
  5. ^ 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 .
  6. ^ Goodin, Dan (10 de septiembre de 2015). "Una vez consideradas a prueba de balas, más de 11 millones de contraseñas de Ashley Madison ya han sido descifradas". Ars Technica . Consultado el 10 de septiembre de 2015 .
  7. ^ ab 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.
  8. ^ Meltem Sönmez Turan; Elaine Barker; William Burr; 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 (PDF) . NIST. doi :10.6028/NIST.SP.800-132. S2CID  56801929.
  9. ^ Krawczyk, Hugo; Eronen, Pasi (mayo de 2010). "La entrada de 'información' a HKDF". datatracker.ietf.org .RFC 5869 (2010)
  10. ^ ab "Hashing de contraseñas con sal: cómo hacerlo bien". CrackStation.net . Consultado el 29 de enero de 2015 .
  11. ^ Abadi, Martín, T. Mark A. Lomas y Roger Needham. "Fortalecimiento de contraseñas". Digital System Research Center, Tech. Rep 33 (1997): 1997.
  12. ^ U. Manber, "Un esquema simple para hacer que las contraseñas basadas en funciones unidireccionales sean mucho más difíciles de descifrar", Computers & Security, v.15, n.2, 1996, pp.171–176.
  13. ^ Aplicaciones seguras de claves de baja entropía, J. Kelsey , B. Schneier , C. Hall y D. Wagner (1997)
  14. ^ "Concurso de hash de contraseñas"
  15. ^ "Hoja de referencia para el almacenamiento de contraseñas". Serie de hojas de referencia de OWASP . OWASP . Consultado el 17 de mayo de 2023 .

Lectura adicional