HKDF es una función de derivación de clave simple (KDF) basada en un código de autenticación de mensajes [1] basado en hash (HMAC). [2] Inicialmente fue propuesto por sus autores como un bloque de construcción en varios protocolos y aplicaciones, así como para desalentar la proliferación de múltiples mecanismos KDF. [2] El enfoque principal que sigue HKDF es el paradigma "extraer-luego-expandir", donde el KDF consiste lógicamente en dos módulos: la primera etapa toma el material de codificación de entrada y "extrae" de él una clave pseudoaleatoria de longitud fija, y luego, la segunda etapa "expande" esta clave en varias claves pseudoaleatorias adicionales (la salida del KDF). [2]
Se puede utilizar, por ejemplo, para convertir secretos compartidos intercambiados a través de Diffie-Hellman en material clave adecuado para su uso en cifrado, verificación de integridad o autenticación. [1]
Se describe formalmente en el RFC 5869. [2] Uno de sus autores también describió el algoritmo en un artículo complementario en 2010. [1]
En noviembre de 2011, NIST publicó SP 800-56C, [3] reemplazado en abril de 2018 por SP 800-56C Rev. 1. [4] Ambos establecen que la especificación de HKDF [2] es un esquema conforme y señalan su documento [ 1] por la justificación de los mecanismos de extracción y expansión de las recomendaciones.
Hay implementaciones de HKDF para C #, Go, [5] Java, [6] JavaScript, [7] Perl, PHP, [8] Python, [9] Ruby y otros lenguajes.
Mecanismo
HKDF extrae una clave pseudoaleatoria (PRK) usando una función hash HMAC (por ejemplo, HMAC - SHA2 56) en una sal opcional (que actúa como clave) y cualquier material de clave de entrada potencialmente débil (IKM) (que actúa como datos). Luego genera material de clave de salida (OKM) criptográficamente fuerte de manera similar de cualquier longitud deseada generando repetidamente bloques hash con clave PRK y luego agregándolos al material de clave de salida, truncando finalmente a la longitud deseada.
Para mayor seguridad, los bloques hash HMAC con clave PRK se encadenan durante su generación anteponiendo el bloque hash anterior a un contador creciente de 8 bits con una cadena de contexto opcional en el medio antes de que HMAC los haga hash para generar el bloque hash actual.
Nota: HKDF no amplifica la entropía, pero permite utilizar una gran fuente de entropía más débil de manera más uniforme y eficaz.
Usos
HKDF tiene dos usos principales y potencialmente independientes:
- Para "extraer" (condensar / mezclar) la entropía de una fuente aleatoria más grande para proporcionar una entropía más uniforme e imparcial, pero una salida más pequeña (por ejemplo, una clave de cifrado ). Esto se hace utilizando las propiedades de difusión de los MAC criptográficos.
- Para "expandir" la salida generada de una entrada ya razonablemente aleatoria, como una clave compartida existente, en una salida criptográficamente independiente más grande, produciendo así múltiples claves determinísticamente a partir de esa clave compartida inicial, de modo que el mismo proceso pueda producir esas mismas claves secretas de forma segura en múltiples dispositivos, siempre que se utilicen las mismas entradas.
Estas dos funciones también se pueden combinar y usar para formar un PRNG para mejorar la salida potencialmente sesgada de un generador de números aleatorios, así como para protegerlo del análisis y ayudar a defender la generación de números aleatorios de entradas maliciosas.
Ejemplo: implementación de Python
#! / usr / bin / env python3 import hashlib import hmac from math import ceilhash_len = 32def hmac_sha256 ( clave , datos ): devuelve hmac . nuevo ( clave , datos , hashlib . sha256 ) . digerir ()def hkdf ( longitud : int , ikm , salt : bytes = b "" , info : bytes = b "" ) -> bytes : "" "Función de derivación de clave" "" if len ( salt ) == 0 : salt = bytes ([ 0 ] * hash_len ) prk = hmac_sha256 ( salt , ikm ) t = b "" okm = b "" para i en el rango ( ceil ( length / hash_len )): t = hmac_sha256 ( prk , t + info + bytes ( [ 1 + i ])) okm + = t volver okm [: longitud ]
Referencias
- ↑ a b c d Krawczyk, Hugo (2010). "Extracción criptográfica y derivación de claves: el esquema HKDF" (PDF) . Archivo ePrint de criptología . Asociación Internacional para la Investigación Criptológica.
- ^ a b c d e Krawczyk, H .; Eronen, P. (mayo de 2010). "RFC 5869" . Grupo de trabajo de ingeniería de Internet .
- ^ Lily Chen (noviembre de 2011). "Recomendación para la derivación de claves mediante extracción-luego-expansión" . Publicación especial del NIST serie 800. Instituto Nacional de Estándares y Tecnología . Cite journal requiere
|journal=
( ayuda ) - ^ Elaine Barker; Lily Chen; Richard Davis (abril de 2018). "Recomendación para métodos de derivación de claves en esquemas de establecimiento de claves" . Publicación especial del NIST serie 800. Instituto Nacional de Estándares y Tecnología . Cite journal requiere
|journal=
( ayuda ) - ^ "paquete hkdf" . godoc.org .
- ^ "Una implementación independiente de Java 7 de la función de derivación de claves basada en HMAC" . github.com .
- ^ "Implementación Node.js de RFC5869: Función de derivación de clave de extracción y expansión basada en HMAC" . npmjs.com .
- ^ "hash_hkdf: genera una derivación de clave HKDF de una entrada de clave proporcionada" . php.net .
- ^ "Función de derivación clave de extracción y expansión basada en HMAC (HKDF) implementada en Python" . github.com .
enlaces externos
- RFC 5869: Función de derivación de clave de extracción y expansión basada en HMAC (HKDF)