Función de derivación de claves
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 que utiliza una función pseudoaleatoria (que normalmente utiliza una función hash criptográfica o cifrado en bloque). Los KDF se pueden utilizar para ampliar 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 usar con AES. Las funciones hash criptográficas con clave son ejemplos populares de funciones pseudoaleatorias utilizadas para la derivación de claves.
Historia
La primera función de derivación de claves basada en contraseña deliberadamente lenta (estiramiento de claves) se llamó "crypt" (o "crypt(3)" después de su página de manual), y fue inventado por Robert Morris en 1978. Cifraría una constante (cero), utilizando los primeros 8 caracteres del código del usuario. contraseña 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ña de Unix. Si bien fue un gran avance en ese momento, los aumentos en las velocidades del procesador desde la era PDP-11 han hecho factibles los ataques de fuerza bruta contra las criptas, y los avances en el almacenamiento han hecho que la sal de 12 bits sea inadecuada. El diseño de la función de cripta 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.
Aunque el alto rendimiento es una propiedad deseable en las funciones hash de uso general, ocurre lo contrario en las aplicaciones de seguridad de contraseñas en las que la defensa contra el cracking por fuerza bruta es una preocupación principal. El uso cada vez mayor de hardware masivamente paralelo como GPU, FPGA e incluso ASIC para el craqueo por fuerza bruta ha hecho que la selección de un algoritmo adecuado sea aún más crítica porque un buen algoritmo no solo debe imponer una cierta cantidad de costo computacional, no solo en CPU, pero también resisten las ventajas de costo/rendimiento de las modernas plataformas masivamente paralelas 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 (siendo este último el ganador del concurso Password Hashing). La violació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 hace que el descifrado por fuerza bruta a gran escala sea costoso y requiera mucho tiempo), una porción importante de las cuentas en los datos comprometidos también contenían un hash de contraseña basado en el rápido algoritmo MD5 de uso general, lo que hizo que Es posible descifrar más de 11 millones de contraseñas en cuestión de semanas.
En junio de 2017, el Instituto Nacional de Estándares y Tecnología (NIST) de EE. UU. emitió una nueva revisión de sus pautas de autenticación digital, NIST SP 800-63B-3, 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 SE DEBEN salar y aplicar hash utilizando una función de derivación de clave unidireccional adecuada. Las funciones de derivación de claves 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 prueba de adivinación de contraseña por parte de un atacante que haya obtenido un archivo hash de contraseña sea costosa 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 (especificada en RFC 2898), se basan en un hash criptográfico reconocido, como SHA-2, utilizan más sal (al menos 64 bits y se eligen al azar) y un alto recuento de iteraciones. NIST recomienda un recuento mínimo de iteraciones de 10.000. "Para claves especialmente críticas, o para sistemas muy potentes o sistemas donde el rendimiento percibido por el usuario no es crítico, un recuento de iteraciones de 10.000.000 puede ser apropiado".
Derivación de clave
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 sobre este tema incluyen:
- Junto con parámetros no secretos para obtener una o más claves de un valor secreto común (que a veces también se denomina "diversificación clave"). Tal uso puede impedir a un atacante que obtenga una clave derivada de aprender información útil sobre el valor secreto de entrada o cualquiera de las otras claves derivadas. También se puede utilizar un KDF para garantizar que las claves derivadas tengan otras propiedades deseables, como evitar "claves débiles" en algunos sistemas de encriptación específicos.
- Como componentes de protocolos de acuerdo clave multipartidista. Ejemplos de tales funciones clave de derivación incluyen KDF1, definidas en IEEE Std 1363-2000, y funciones similares en ANSI X9.42.
- Para obtener claves de contraseñas secretas o contraseñas (a KDF basado en contraseña).
- Para obtener claves de diferente longitud de las proporcionadas. Los KDF diseñados para este propósito incluyen HKDF y SSKDF. Estos toman una cadena de bits 'info' como un parámetro opcional adicional 'info', que puede ser crucial para vincular el material clave derivado a la información de aplicación y context-specific.
- El estiramiento clave y el fortalecimiento clave.
Estiramiento clave y fortalecimiento clave
Las funciones de derivación de claves también se utilizan en aplicaciones para derivar claves a partir de contraseñas o frases de contraseña secretas, que normalmente no tienen las propiedades deseadas para usarse directamente como claves criptográficas. En tales aplicaciones, generalmente se recomienda que la función de derivación de claves se haga deliberadamente lenta para frustrar un ataque de fuerza bruta o un ataque de diccionario sobre la contraseña o el valor de entrada de la 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, key es la clave o contraseña original, salt es un número aleatorio que actúa como sal criptográfica y 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 salt y el número de iteraciones (si no está fijo) se almacenan con la contraseña hash o se envían como texto sin cifrar (sin cifrar) con un mensaje cifrado.
La dificultad de un ataque de fuerza bruta aumenta con el número de iteraciones. Un límite práctico en el recuento 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 salt impide que los atacantes precalculen un diccionario de claves derivadas.
Un enfoque alternativo, llamado fortalecimiento de clave, extiende la clave con una sal aleatoria, pero luego (a diferencia del estiramiento de clave) elimina la sal de forma segura. Esto obliga tanto al atacante como a los usuarios legítimos a realizar una búsqueda de fuerza bruta del valor de la sal. Aunque el artículo que introdujo el estiramiento clave se refería a esta técnica anterior y eligió intencionalmente un nombre diferente, el término "fortalecimiento clave" se refiere a esta técnica anterior. ahora se usa a menudo (posiblemente incorrectamente) para referirse al estiramiento de teclas.
Hash de contraseña
A pesar de su uso original para la derivación de claves, los KDF posiblemente sean más conocidos por su uso en hashing de contraseñas (verificación de contraseñas mediante comparación de hash), como lo utiliza el archivo passwd o el archivo de contraseña oculta. Las funciones hash de contraseñas deberían ser relativamente costosas de calcular en caso de ataques de fuerza bruta, y la extensión de claves de los KDF proporciona esta característica. 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.
A partir de mayo de 2023, OWASP recomienda los siguientes KDF para el hash de contraseñas, enumerados en orden de prioridad:
1. Argón2id
Did you mean:2. script if Argon2id is unavailable
3. bcrypt para sistemas heredados
4. PBKDF2 si se requiere cumplimiento con FIPS-140
Contenido relacionado
Fundación para Agentes Físicos Inteligentes
Máquina virtual (sistema operativo)
Líneas de código fuente