Key derivation function
Una función de derivación de claves (KDF) es un algoritmo criptográfico que deriva uno o más conjuntos de material de claves a partir de un secreto existente, como una clave compartida, el resultado de un acuerdo de claves o una contraseña, junto con información de contexto y otros parámetros.[1] Los KDF permiten que un protocolo convierta un secreto en claves de la longitud requerida y asigne claves separadas para propósitos distintos.
El término cubre dos clases relacionadas pero distintas. A KDF basado en claves comienza a partir de entradas que ya tienen una fuerza criptográfica sustancial. A KDF basado en contraseña comienza a partir de una contraseña o frase de contraseña seleccionada por un ser humano y aumenta deliberadamente el costo de las pruebas de conjeturas. Confundir los dos puede producir diseños inseguros: un KDF general rápido no hace que una contraseña débil sea resistente a adivinaciones fuera de línea.
Derivación basada en claves
Los protocolos a menudo obtienen un secreto inicial a través de una operación de acuerdo de clave y luego necesitan diferentes claves para el cifrado, la autenticación de mensajes o distintas direcciones de una conexión. Un KDF puede combinar el secreto con etiquetas y contexto (como identificadores de protocolo, identidades de partes o datos de transcripción) para separar los resultados para diferentes propósitos.
NIST SP 800-108 especifica construcciones de contador, retroalimentación y doble canalización basadas en funciones pseudoaleatorias que incluyen HMAC, CMAC y KMAC.[2] La construcción exacta y sus entradas son parte de una especificación de protocolo; Es posible que simplemente aplicar hash a un secreto sin separación de dominios no proporcione las propiedades requeridas.
Extraer y expandir
HKDF es un KDF basado en HMAC estandarizado en RFC 5869. Sigue un extraer-luego-expandir diseño. La etapa de extracción convierte material de claves de entrada potencialmente no uniforme en una clave pseudoaleatoria de longitud fija. La etapa de expansión deriva una o más salidas al tiempo que vincula información de contexto opcional.[3]
HKDF está destinado a material de claves criptográficas, como un resultado Diffie-Hellman. Es deliberadamente eficiente y no reemplaza un esquema de hash de contraseñas cuando la entrada se puede adivinar a partir de un pequeño diccionario.
Derivación basada en contraseña
Un KDF basado en contraseña combina una contraseña con parámetros de sal y costo. La sal normalmente se almacena con el resultado y no es necesario que sea secreta. Su propósito es hacer que contraseñas idénticas produzcan resultados diferentes y evitar que una tabla precalculada se reutilice en muchos registros. El factor trabajo hace que cada conjetura sea más costosa tanto para el sistema legítimo como para el atacante.[4]
PBKDF2 aplica una función pseudoaleatoria repetidamente y está especificada por PKCS #5 y la guía NIST. Su principal costo ajustable es un recuento de iteraciones. Ese parámetro debe seleccionarse para la aplicación y el hardware y debe aumentarse con el tiempo cuando la compatibilidad lo permita; no existe un recuento de iteraciones permanente que sea apropiado para cada sistema.
Los esquemas de hash de contraseñas modernos también pueden imponer un costo de memoria configurable. Las funciones de memoria dura tienen como objetivo encarecer las conjeturas a gran escala no sólo en las operaciones del procesador sino también en la memoria y el ancho de banda. scrypt, Argon2 y Lyra2 son ejemplos de diseños de esta familia. RFC 9106 especifica Argon2 y recomienda la variante híbrida Argon2id para el hash de contraseñas general, con perfiles elegidos según la memoria y la latencia disponibles.[5]
Usos
Los KDF se utilizan para:
- derivar claves de tráfico y material de inicialización después de un intercambio de claves;
- crear claves de cifrado y autenticación independientes a partir de un secreto maestro;
- vincular claves a un protocolo, sesión, identidad o propósito;
- derivar una clave de cifrado de almacenamiento a partir de una frase de contraseña;
- almacenar un verificador derivado de una contraseña en lugar de la contraseña misma; y
- producir una clave de una longitud exacta requerida por otra primitiva criptográfica.
Un verificador de contraseñas y una clave de cifrado pueden ser resultados de la derivación basada en contraseñas, pero los modelos de amenazas que las rodean difieren. La verificación de contraseña debe limitar los intentos en línea y proteger la base de datos del verificador; El cifrado del almacenamiento también debe considerar cómo se borra, retiene y recupera la clave derivada.
Consideraciones de seguridad
La seguridad de un KDF depende de la solidez de su entrada, la construcción, la elección de parámetros y el contexto vinculante. Un KDF no puede crear entropía que no se encuentre en una contraseña adivinable. Las sales evitan el cálculo previo de registros cruzados, pero no es necesario adivinarlas y no ralentizan un ataque dirigido por sí solas.
Para el uso basado en contraseñas, los parámetros de costos deben calibrarse en función de la implementación real, de modo que el uso legítimo siga siendo aceptable aunque las conjeturas sean costosas. Las implementaciones también deben vincular los parámetros controlados por el atacante para evitar la denegación de servicio, comparar verificadores de contraseñas sin filtrar información de tiempo útil y migrar conjuntos de parámetros antiguos después de una autenticación exitosa. Un valor secreto del lado del servidor, a veces llamado pepper, puede agregar una capa de protección separada, pero no sustituye a un salt único ni a una función hash de contraseña adecuada.
Para el uso basado en claves, las aplicaciones deben seguir el KDF definido por su protocolo en lugar de inventar una nueva composición. Reutilizar una clave derivada para algoritmos no relacionados u omitir el contexto del protocolo puede anular la separación entre usos.
Estándares y desarrollo histórico.
El almacenamiento de contraseñas de Unix fue un predecesor importante de los KDF modernos basados en contraseñas. El relato de Robert Morris y Ken Thompson de 1979 describió una cripta diseño que utilizó los primeros ocho caracteres de la contraseña como clave, aplicó un cálculo DES modificado 25 veces y seleccionó una de 4.096 variantes con una sal de 12 bits.[6] La sal frustró la reutilización de un diccionario precalculado en todas las cuentas, mientras que el cálculo repetido aumentó el costo de cada conjetura en el hardware contemporáneo. Los límites fijos y el aumento de la potencia informática finalmente hicieron que este esquema no fuera adecuado para la protección con contraseña moderna.
Los hashes de contraseñas posteriores introdujeron parámetros de costos ajustables y primitivas más sólidas. Bcrypt añadió un factor de trabajo adaptable en la década de 1990; scrypt agregó un costo de memoria configurable; y el concurso Password Hashing seleccionó a Argon2 y otorgó un reconocimiento especial a Catena, Lyra2, Makwa y yescrypt.[7] Estas funciones no son intercambiables únicamente porque cada una puede procesar una contraseña: las aplicaciones deben seguir las reglas de codificación, parámetros y migración de la función seleccionada.
NIST SP 800-132 especifica la derivación basada en PBKDF2 para proteger los datos almacenados y contiene un aviso de que NIST planea revisar la publicación.[8] La guía actual de identidad digital del NIST requiere un hash de contraseña salado con un esquema adecuado y recomienda una función de memoria dura. Estos requisitos se aplican a los verificadores de contraseñas; no deben generalizarse afirmando que cada KDF criptográfico debe ser lento o tener poca memoria.[9]
Referencias
- ↑ NIST Computer Security Resource Center, “Key-derivation function”, accessed 13 September 2026
- ↑ NIST SP 800-108 Rev. 1, Recommendation for Key Derivation Using Pseudorandom Functions, updated 2 February 2024
- ↑ Hugo Krawczyk and Pasi Eronen, RFC 5869, “HMAC-based Extract-and-Expand Key Derivation Function”, May 2010
- ↑ K. Moriarty, B. Kaliski and A. Rusch, RFC 8018, PKCS #5: Password-Based Cryptography Specification Version 2.1, January 2017
- ↑ Alex Biryukov et al., RFC 9106, “Argon2 Memory-Hard Function for Password Hashing and Proof-of-Work Applications”, September 2021
- ↑ Robert Morris and Ken Thompson, “Password Security: A Case History”, Communications of the ACM, November 1979; Niels Provos, “Bcrypt at 25: A Retrospective on Password Security”, USENIX, 22 May 2023
- ↑ Password Hashing Competition, “Password Hashing Competition”, accessed 13 September 2026
- ↑ NIST SP 800-132, Recommendation for Password-Based Key Derivation: Part 1: Storage Applications, December 2010
- ↑ NIST SP 800-63B, Digital Identity Guidelines: Authentication and Authenticator Management, 2025
