
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 bloques ). [ 1 ] [ 2 ] [ 3 ] Las KDF se pueden utilizar para extender claves a claves más largas u obtener claves con 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 función de derivación de clave basada en contraseña, deliberadamente lenta (con estiramiento de clave), se denominó " crypt " (o "crypt(3)" según su página de manual ) y fue inventada por Robert Morris en 1978. Cifraba una constante (cero), utilizando los primeros 8 caracteres de la contraseña del usuario como clave, mediante 25 iteraciones de un algoritmo de cifrado DES modificado (en el que se utiliza un número de 12 bits leído del reloj del ordenador en tiempo real para perturbar los cálculos). El número resultante de 64 bits se codifica como 11 caracteres imprimibles y se almacena en el archivo de contraseñas de Unix . [ 5 ] Si bien supuso un gran avance en su momento, el aumento de la velocidad de los procesadores desde la era del PDP-11 ha hecho factibles los ataques de fuerza bruta contra crypt , y los avances en el almacenamiento han hecho que el salt de 12 bits resulte inadecuado. 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 e imposibilita la creación de contraseñas seguras .
Si bien 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, donde la defensa contra el descifrado por fuerza bruta es una preocupación primordial. 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, ya que un buen algoritmo debe imponer un cierto costo computacional no solo en las CPU, sino también resistir 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 ganador de la Password Hashing Competition ). La filtración masiva de datos 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 la seguridad de 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 lento), una parte significativa de las cuentas en los datos comprometidos también contenía un hash de contraseña basado en el algoritmo MD5 , rápido, de propósito general e inseguro , lo que permitió 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 EE. UU. (NIST) publicó una nueva revisión de sus directrices 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 un formato resistente a ataques fuera de línea. Los secretos memorizados DEBEN ser salteados y hasheados utilizando una función de derivación de clave unidireccional adecuada. Las funciones de derivación de clave toman como entrada una contraseña, un salt y un factor de costo, y luego generan un hash de contraseña. Su propósito es hacer que cada intento de adivinar la contraseña por parte de un atacante que haya obtenido un archivo hash de contraseña sea costoso y, por lo tanto, el costo de un ataque de adivinación sea alto o prohibitivo."
Las funciones modernas de derivación de claves basadas en contraseñas, como PBKDF2 , [ 2 ] se basan en una función hash criptográfica reconocida, como SHA-2 , utilizan más sal (al menos 64 bits y elegida 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 una KDF es la derivación de claves, es decir, la generación de claves a partir de contraseñas o frases de contraseña secretas. Algunas variaciones sobre este tema incluyen:
- En combinación con parámetros no secretos, se derivan una o más claves a partir de un valor secreto común (lo que a veces se denomina " diversificación de claves "). Este uso puede impedir que un atacante que obtenga una clave derivada descubra información útil sobre el valor secreto de entrada o cualquiera de las otras claves derivadas. Una función de derivación de clave (KDF) también puede utilizarse para garantizar que las claves derivadas posean otras propiedades deseables, como evitar las "claves débiles" en algunos sistemas de cifrado específicos.
- Como componentes de protocolos de acuerdo de claves multipartitos . Ejemplos de dichas funciones de derivación de claves incluyen KDF1, definida en IEEE Std 1363-2000 , y funciones similares en ANSI X9.42.
- Para derivar claves a partir de contraseñas o frases de contraseña secretas (una KDF basada en contraseñas ).
- Para derivar claves de distinta longitud a las proporcionadas. Las KDF diseñadas para este propósito incluyen HKDF y SSKDF. Estas aceptan una cadena de bits 'info' como parámetro 'info' adicional opcional, que puede ser crucial para vincular el material de clave derivado con información específica de la aplicación y del contexto. [ 9 ]
- Estiramientos clave y fortalecimiento clave.
Estiramientos clave y fortalecimiento clave
Las funciones de derivación de claves también se utilizan en aplicaciones para obtener claves a partir de contraseñas o frases de contraseña secretas, que normalmente no poseen las propiedades necesarias para ser utilizadas directamente como claves criptográficas. En tales aplicaciones, se recomienda que la función de derivación de claves sea deliberadamente lenta para dificultar los ataques de fuerza bruta o de diccionario sobre el valor de entrada de la contraseña o frase de contraseña.
Dicho uso puede expresarse como DK = KDF(clave, sal, iteraciones) , donde DK es la clave derivada, KDF es la función de derivación de 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 hash o se envían en texto plano (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 renuencia de los usuarios a tolerar un retraso perceptible al iniciar sesión en un ordenador o al ver un mensaje descifrado. El uso de sal impide que los atacantes precalculen un diccionario de claves derivadas. [ 10 ]
Un enfoque alternativo, denominado fortalecimiento de clave , extiende la clave con un valor aleatorio (salt), pero luego (a diferencia del estiramiento de clave) elimina el valor de forma segura. [ 11 ] Esto obliga tanto al atacante como a los usuarios legítimos a realizar una búsqueda por fuerza bruta del valor del valor. [ 12 ] Si bien el artículo que introdujo el estiramiento de clave [ 13 ] se refería a esta técnica anterior y eligió intencionadamente un nombre diferente, el término "fortalecimiento de clave" se utiliza ahora a menudo (posiblemente de forma incorrecta) para referirse al estiramiento de clave.
Hash 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 mediante comparación de hashes ), como el que utilizan el archivo passwd o el archivo shadow password . Las funciones hash de contraseñas deben ser relativamente costosas de calcular en caso de ataques de fuerza bruta, y las KDF están diseñadas con esta característica incorporada. [ 14 ] 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 finalizó el concurso y Argon2 fue anunciado como el ganador final. Otros cuatro algoritmos recibieron un reconocimiento especial: Catena, Lyra2 , Makwa y yescrypt . [ 15 ]
A partir de mayo de 2023, el Open Worldwide Application Security Project (OWASP) recomienda las siguientes KDF para el hash de contraseñas, enumeradas en orden de prioridad: [ 16 ]
- Argon2id
- scrypt si Argon2id no está disponible
- bcrypt para sistemas heredados
- PBKDF2 si se requiere el cumplimiento de FIPS-140.
Referencias
- ^ 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.
- 1 2 B. Kaliski; A. Rusch (enero de 2017). K. Moriarty (ed.). PKCS #5: Especificación de criptografía basada en contraseña Versión 2.1 . Grupo de trabajo de ingeniería de Internet . doi : 10.17487/RFC8018 . ISSN 2070-1721 . RFC 8018 . Informativo. Sustituye a RFC 2898. Actualizado por RFC 9579 .
- ↑ Chen, Lily (octubre de 2009). "NIST SP 800-108: Recomendación para la derivación de claves mediante funciones pseudoaleatorias" . NIST.
- ↑ Zdziarski, Jonathan (2012). Hacking y seguridad de aplicaciones iOS: robo de datos, secuestro de software y cómo prevenirlo . O'Reilly Media. págs. 252–253 . ISBN 9781449318741.
- ↑ Morris, Robert; Thompson, Ken (3 de abril de 1978). "Seguridad de contraseñas: un estudio de caso" . Bell Laboratories . Archivado del original el 22 de marzo de 2003. Recuperado el 9 de mayo de 2011 .
- ↑ Goodin, Dan (10 de septiembre de 2015). "Contraseñas que antes se consideraban 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 .
- 1 2 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 .
- ↑ 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 .
- ↑ Krawczyk, Hugo; Eronen, Pasi (mayo de 2010). "La entrada de 'información' a HKDF" . datatracker.ietf.org .RFC 5869 (2010)
- 1 2 "Salted Password Hashing – Doing it Right" . CrackStation.net . Consultado el 29 de enero de 2015 .
- ↑ Abadi, Martín, T. Mark A. Lomas y Roger Needham. "Fortalecimiento de contraseñas". Centro de Investigación de Sistemas Digitales, Informe Técnico 33 (1997): 1997.
- ↑ 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, vol. 15, n.º 2, 1996, págs. 171-176.
- ↑ Aplicaciones seguras de claves de baja entropía , J. Kelsey , B. Schneier , C. Hall y D. Wagner (1997)
- ↑ Instituto Nacional de Estándares y Tecnología (NIST) (diciembre de 2010). Recomendación para la derivación de claves basada en contraseñas (PDF) (Informe). Publicación especial. Vol. 800–132 . NIST.
- ↑ "Competencia de Hashing de Contraseñas"
- ↑ "Hoja de referencia rápida para el almacenamiento de contraseñas" . Serie de hojas de referencia rápida de OWASP . OWASP . Consultado el 17 de mayo de 2023 .
Lecturas adicionales
- Percival, Colin (mayo de 2009). "Derivación de claves más robusta mediante funciones secuenciales de memoria difícil" (PDF) . Presentación en BSDCan'09 . Recuperado el 19 de mayo de 2009 .
- Funciones de derivación clave
- Gestión clave
- Funciones de derivación clave