Derivación de claves (KDF): definición y funcionamiento en criptografía
Descubre qué es una función KDF, cómo deriva claves seguras desde contraseñas y su papel crucial en la criptografía para proteger datos y comunicaciones.
En criptografía, una función de derivación de clave (KDF) crea una clave secreta larga (que se llama "hash") a partir de una frase secreta, como una contraseña. El resultado de una función de derivación de clave tendrá un aspecto común a otro resultado hecho a partir de una frase aleatoria. También se utilizan para reutilizar claves secretas en un formato específico, como el uso de una clave secreta compartida del intercambio de claves Diffie-Hellman para enviar secretos en AES.
¿Para qué sirven las KDF?
Las KDF tienen varios propósitos importantes:
- Derivar claves criptográficas seguras a partir de material de menor entropía (por ejemplo, una contraseña o una clave compartida de un protocolo de establecimiento de claves).
- Estirar claves (key stretching): aumentar el coste computacional necesario para probar contraseñas por fuerza bruta.
- Separación de claves (key separation): generar varias claves independientes (por ejemplo, para cifrado y autenticación) a partir de una sola semilla.
- Normalizar la salida para que tenga la longitud y el formato adecuados para algoritmos simétricos (por ejemplo, claves de 128/256 bits para AES).
Conceptos clave y cómo funcionan
- Entrada (seed): la frase secreta o material inicial (contraseña, clave DH compartida, etc.).
- Salt (sal): datos aleatorios únicos por derivación que previenen ataques por tablas precalculadas (rainbow tables) y permiten que dos iguales contraseñas produzcan resultados distintos. El salt no necesita ser secreto y se almacena junto al resultado.
- Iteraciones / coste: número de rondas o parámetros que aumentan el coste computacional (CPU y/o memoria). Incrementan la dificultad de ataques por fuerza bruta.
- Salida: la clave derivada de la longitud deseada; suele presentarse como un valor pseudoaleatorio uniforme.
- Función subyacente: puede basarse en hash (HMAC, SHA), cifrado o funciones de memoria intensiva.
Tipos y algoritmos comunes
- PBKDF2 (basado en HMAC): ampliamente usado y soportado por muchas librerías; configurable en número de iteraciones. Adecuado si se necesita compatibilidad amplia.
- bcrypt: diseñado para almacenar contraseñas; incorpora factor de costo y resistencia a ataques en hardware especializado.
- scrypt: función memory-hard que obliga a usar memoria significativa, limitando la ventaja de GPUs/ASICs.
- Argon2 (Argon2i, Argon2d, Argon2id): ganador del concurso Password Hashing Competition; Argon2id es una opción recomendada por su equilibrio entre resistencia a canal lateral y ataques por GPU/ASIC.
- HKDF (HMAC-based Extract-and-Expand KDF): diseñado para extraer y expandir material pseudoaleatorio; útil en protocolos para derivar múltiples claves a partir de una fuente de alta entropía.
Buenas prácticas
- Usar un salt aleatorio y único para cada derivación y almacenarlo junto al resultado (no es secreto).
- Seleccionar parámetros de coste (iteraciones, memoria, paralelismo) de forma que la derivación sea notablemente costosa para atacantes pero aceptable para la experiencia de usuario; probar en el hardware objetivo. Una práctica común: ajustar el coste para que la operación dure decenas o cientos de milisegundos en el dispositivo objetivo.
- Para hashing de contraseñas, preferir funciones memory-hard actuales (Argon2id o scrypt) frente a sólo aumentar iteraciones de PBKDF2.
- Derivar una clave con la longitud apropiada para el uso final (p. ej., 128 o 256 bits para AES).
- Usar HKDF o un mecanismo similar cuando se necesite extraer y expandir material de alta entropía para múltiples claves (separación de dominios mediante el parámetro "info").
- No reutilizar parámetros (salt o contador de iteraciones) sin motivo; documentar y versionar el esquema de hashing para poder migrar si cambian las recomendaciones.
Seguridad y consideraciones prácticas
- El objetivo de una KDF es que la salida sea indistinguible de una cadena aleatoria para un atacante que desconozca la entrada.
- Elegir parámetros adecuados es crítico: valores débiles permiten ataques por fuerza bruta; valores excesivos degradan la usabilidad o el rendimiento del servidor.
- Considerar el uso de un pepper (valor secreto adicional) en sistemas donde sea aceptable almacenar un secreto separado para aumentar la protección frente a filtraciones de la base de datos de hashes.
- Proteger implementaciones contra fugas por canales laterales (timing, memoria) cuando sea relevante.
- Evitar crear KDFs caseros: usar implementaciones probadas y mantenidas por la comunidad o estandarizadas.
Ejemplo práctico (conceptual)
Para obtener una clave AES de 256 bits a partir de una contraseña:
- Generar un salt aleatorio (p. ej. 16 bytes) y guardarlo.
- Aplicar una KDF adecuada (p. ej., Argon2id o PBKDF2-HMAC-SHA256) usando la contraseña, el salt y parámetros de coste decididos.
- Extraer 256 bits de la salida como la clave para AES-GCM. Al verificar la contraseña, volver a derivar con el mismo salt y parámetros y comparar de forma segura.
Resumen
Las funciones de derivación de clave (KDF) convierten material secreto de distinta calidad (contraseñas, claves compartidas) en claves criptográficas seguras y adecuadas para su uso. Son esenciales para el almacenamiento seguro de contraseñas, la separación de claves y la interoperabilidad entre protocolos. Seleccionar el algoritmo y parámetros correctos (sal, iteraciones/memoria) y usar implementaciones probadas son pasos claves para mantener la seguridad.
Utilice
Las funciones de derivación de claves son importantes para la seguridad. Permiten ampliar una "frase secreta" más pequeña en una clave más grande (de una longitud fija decidida por el tamaño del compendio de la KDF). Esto hace que sea más difícil encontrar la "frase secreta" original. La longitud de la clave hace más difícil descubrir la frase o el secreto oculto por ensayo y error (es decir, por fuerza bruta), al dificultar su adivinación por parte de un ordenador. A veces, se añade un pequeño dato aleatorio (llamado "sal") a la frase secreta antes de utilizarla con un KDF para dificultar la adivinación de la "frase secreta" original con una lista de "hashes" conocidos.
Hace que la comprobación de contraseñas sea más segura sin utilizar la contraseña real. En lugar de guardar la contraseña real, se guarda un "hash" de la clave y, al comprobar la contraseña, el "hash" de la contraseña real se comprueba con la entrada. Algunos programas ponen un límite a la longitud de la contraseña y a veces se utilizan para hacer más pequeñas las frases secretas más grandes. Los KDFs también están hechos de tal manera que, al ordenador le cuesta un poco de esfuerzo hacer el "hash". Esto dificulta la elaboración de una lista de posibles combinaciones.
KDFs de uso común
- SHA-2
- PBKDF2
- Scrypt
- Bcrypt
- Argón2
- Chacha20
Buscar dentro de la enciclopedia