Articulo de referencia

HKDF

HKDF es una función de derivación de claves (KDF) multipropósito basada en el código de autenticación de mensajes HMAC . HKDF sigue el paradigma "extraer y luego expandir", dond...

HKDF es una función de derivación de claves (KDF) multipropósito basada en el código de autenticación de mensajes HMAC . HKDF sigue el paradigma "extraer y luego expandir", donde la KDF consta lógicamente de dos módulos: la primera etapa toma el material de clave 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 e independientes como salida de la KDF.

Mecanismo

HKDF es la composición de dos funciones, HKDF-Extract y HKDF-Expand:

HKDF(sal, IKM, información, longitud) = HKDF-Expandir(HKDF-Extraer(sal, IKM), información, longitud) [ 1 ] : 11

Extracto de HKDF

HKDF-Extract ( XTR ) toma "material de clave de entrada" o "material de clave de origen" ( IKM o SKM ), como un secreto compartido generado usando Diffie-Hellman ; una sal opcional, no secreta, aleatoria o pseudoaleatoria ( r ); y genera una clave criptográfica llamada PRK ("clave pseudoaleatoria"). HKDF-Extract actúa como un " extractor de aleatoriedad ", [ a ] [ 1 ] : 1 específicamente un "extractor computacional", tomando un valor potencialmente no uniforme de min-entropía suficiente y generando un valor indistinguible de un valor aleatorio uniforme (pseudoaleatorio). [ 1 ] : 9–11 [ 2 ] Los extractores computacionales asumen que los atacantes están limitados computacionalmente y que la entropía de origen solo puede existir en un sentido computacional . Dichos extractores pueden construirse utilizando funciones criptográficas bajo supuestos adecuados, modelados como una función hash universal (en el caso genérico) o un oráculo aleatorio (en escenarios restringidos como fuentes con entropía débil). [ 1 ] : 1–3

Salt ( r ) actúa como un "extractor independiente de la fuente", [ b ] reforzando las garantías de seguridad de HKDF. [ 2 ] El uso de un r público fijo es seguro para múltiples invocaciones de HKDF (en IKM "independientes" pero secretos que pueden o no derivarse de la misma fuente), [ 1 ] : 4–6 [ 3 ] : 6 siempre que r no sea elegido o manipulado por un atacante. [ 3 ] : 6 Idealmente, r es una cadena aleatoria de la longitud de salida de la función hash. Incluso se recomienda un r de baja calidad (entropía débil o longitud más corta) ya que contribuyen "significativamente" a la seguridad del OKM . [ 3 ] : 4–5 Sin o con un r no secreto de baja entropía , si un atacante puede influir en la fuente de IKM de una manera que explote específicamente la función hash subyacente de HKDF-Extract (encontrando una colisión o un sesgo específico), XTR no proporciona protección. Un r aleatorio , incluso si está fijo por la aplicación (por ejemplo, generadores de números aleatorios que usan r como semilla), fortalecería las protecciones para esa sesión de extractor específica. [ 1 ] : 9, 24–26 En tal escenario, los IKM suficientemente largos también proporcionan una mejor extracción de entropía. [ 1 ] : 24 Sin embargo, permitir que el atacante influya lo suficiente en el IKM después de ver r puede resultar en un KDF completamente inseguro. [ 1 ] : 8–9

HKDF-Extract es el resultado de HMAC con r como clave (todos ceros hasta la longitud de la función hash extractora subyacente, si no se proporciona) y el IKM como mensaje. [ 3 ] : 3 La función hash subyacente utilizada para el paso HKDF-Extract puede ser diferente a la utilizada por HKDF-Expand. Se recomienda que HKDF-Extract utilice la función hash más fuerte disponible para la aplicación, [ 1 ] : 27 ya que "concentra" la entropía ya presente en IKM pero no necesariamente "añade" a ella. [ 3 ] : 2 La salida truncada de una función hash subyacente más fuerte para XTR (por ejemplo, SHA512/256) ofrece propiedades de extracción más fuertes. [ 1 ] : 17 Se supone que el atacante tiene conocimiento parcial sobre IKM (valores conocidos públicamente en el caso de Diffie-Hellman) o control parcial sobre él (grupos de entropía). [ 3 ] : 2

Se puede omitir HKDF-Extract si el IKM es en sí mismo una clave criptográficamente fuerte (y por lo tanto puede asumir el rol de PRK ), aunque se recomienda que se aplique HKDF-Extract en aras de la compatibilidad con el caso general, [ 3 ] : 5 especialmente si r está disponible para la aplicación.

HKDF-Expansión

HKDF-Expand ( PRF* ) toma la PRK [ 1 ] : 9–11 (o cualquier clave de derivación de clave aleatoria si se omite el paso HKDF-Extract), [ 3 ] : 5 información opcional ( CTXinfo ) y una longitud ( L ), para generar material de clave de salida ( OKM ) de longitud L. [ 1 ] : 9–11 Se pueden generar múltiples OKM a partir de una sola PRK usando diferentes valores para CTXinfo , que debe ser "independiente" del IKM pasado en HKDF-Extract. [ 3 ] : 5 Incluso si un atacante, que conoce r y alguna información auxiliar sobre el IKM secreto , puede forzar el uso del mismo IKM (y PRK , por extensión), en dos o más contextos HKDF-Expand (representados por CTXinfo ), la salida de los OKM es computacionalmente independiente (no filtra información útil entre sí). [ 1 ] : 7–8

HKDF-Expand, que actúa como una función pseudoaleatoria de longitud de salida variable ( PRF* ) basada en PRK , [ 1 ] : 15 llama a HMAC en CTXinfo como el mensaje (cadena vacía, si no se especifica) añadido a un contador de 8 bits inicializado en1 . [ 1 ] : 18 Las llamadas subsiguientes a HMAC se encadenan en "modo de retroalimentación" anteponiendo la salida anterior de HMAC a CTXinfo e incrementando i . [ 3 ] OKM es una función del tamaño de salida ( k bits) de la función hash subyacente de HMAC; es decir, SHA-256 genera OKM en segmentos de k = 256 bits hasta una longitud máxima de i × k bits (255 × 256 bits = 8160 bytes) truncada a la longitud deseada L . [ 1 ] : 11

Se puede omitir HKDF-Expand si PRK tiene al menos la longitud deseada L , aunque se recomienda aplicar HKDF-Expand para un "suavizado" adicional del OKM . [ 1 ] : 27 [ 3 ] : 6

Normalización

HKDF fue propuesto como un componente básico en varios protocolos y aplicaciones, así como para desalentar la proliferación de múltiples mecanismos KDF por parte de sus autores. [ 3 ] : 1

Se describe formalmente en RFC 5869 [ 3 ] con un análisis detallado en un artículo publicado en 2010. [ 1 ] NIST SP800-56Cr2 [ 4 ] especifica un esquema parametrizable de extracción y expansión, señalando que RFC 5869 HKDF es una versión del mismo y citando su artículo para la justificación de los mecanismos de extracción y expansión de las recomendaciones.

Aplicaciones

HKDF se utiliza en el Protocolo Signal para la mensajería cifrada de extremo a extremo, donde genera las claves de mensaje, junto con el protocolo de acuerdo de claves de intercambio de claves Diffie-Hellman de triple curva elíptica (X3DH). [ 5 ] Las funciones "Recuperación segura de valor" [ 6 ] y "Señalizado remitente" de Signal se basan en HKDF. [ 7 ] HKDF es un componente principal en el Marco del Protocolo Noise , Seguridad de la capa de mensajes , y se utiliza en protocolos ampliamente implementados como el Intercambio de claves de Internet IPsec y TLS 1.3 . [ 5 ]

La naturaleza "multiusos" de HKDF está diseñada para servir a aplicaciones que requieren extracción de claves, expansión de claves y jerarquías de claves en esquemas de encapsulación de claves , intercambio de claves , PRNG y derivación de claves basada en contraseñas . [ 8 ]

Implementaciones

Hay implementaciones de HKDF para C# , Go , [ 9 ] Java , JavaScript , Perl , PHP , [ 10 ] Python , Ruby , Rust y otros lenguajes de programación . RFC6234 establece una implementación de referencia en C de HKDF basada en el estándar Secure Hash . [ 11 ]

Ejemplo en Python

#!/usr/bin/env python3import hashlib import hmac# nb: no se usa aquí; pero SHA512/256 en la fase de extracción proporciona garantías de extracción más fuertes cuando la expansión es SHA256. # hash_function_extract = hashlib.sha512 # RFC5869 incluye vectores de prueba SHA-1 hash_function = hashlib . sha256def hmac_digest ( clave : bytes , datos : bytes ) -> bytes : return hmac . nuevo ( clave , datos , función_hash ) . digest ()def hkdf_extract ( salt : bytes , ikm : bytes ) -> bytes : if len ( salt ) == 0 : salt = bytes ([ 0 ] * hash_function () . digest_size ) return hmac_digest ( salt , ikm )def hkdf_expand ( prk : bytes , info : bytes , length : int ) -> bytes : t = b "" okm = b "" i = 0 while len ( okm ) < length : i += 1 t = hmac_digest ( prk , t + info + bytes ([ i ])) okm += t return okm [: length ]def hkdf ( salt : bytes , ikm : bytes , info : bytes , length : int ) -> bytes : prk = hkdf_extract ( salt , ikm ) return hkdf_expand ( prk , info , length )okm = hkdf ( salt = bytes . fromhex ( "000102030405060708090a0b0c" ), ikm = bytes . fromhex ( "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" ), info = bytes . fromhex ( "f0f1f2f3f4f5f6f7f8f9" ), length = 42 , ) assert okm == bytes . fromhex ( "3cb25f25faacd57a90434f64d0362f2a" "2d2d0a90cf1a5a4c5db02d56ecc4c5bf" "34007208d5b887185865" )# Sal de longitud cero assert hkdf ( salt = b "" , ikm = bytes . fromhex ( "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" ), info = b "" , length = 42 , ) == bytes . fromhex ( "8da4e775a563c18f715f802a063c5a31" "b8a11f5c5ee1879ec3454e5f3c738d2d" "9d201395faa4b61a96c8" )

Véase también

Notas

  1. En teoría de la complejidad, informalmente, un extractor mapea distribuciones de probabilidad de entrada con suficiente entropía en distribuciones de salida que son estadísticamente cercanas a la uniforme. [ 1 ] : 4
  2. Una sal aleatoria impone independencia entre la distribución de la fuente (del material clave inicial) y el extractor en sí, y entre diferentes usos del mismo esquema de extractor (por ejemplo, una instancia específica de HMAC) por parte de una aplicación. [ 1 ] : 25–26

Referencias

  1. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 Krawczyk, Hugo (2010). "Extracción criptográfica y derivación de claves: el esquema HKDF" . Archivo de preimpresiones de criptología . Asociación Internacional para la Investigación Criptológica.
  2. 1 2 Krawczyk, Hugo (2012). Extracción criptográfica . Instituto Isaac Newton de Ciencias Matemáticas . El evento ocurre a las 16m vía YouTube. Los extractores de aleatoriedad son algoritmos que mapean fuentes de min-entropía suficiente a salidas que son estadísticamente cercanas a uniformes. La extracción de aleatoriedad se ha convertido en una noción central y omnipresente en la teoría de la complejidad y la informática teórica con innumerables aplicaciones y conexiones sorprendentes y unificadoras con otras nociones. La criptografía también se ha beneficiado enormemente de esta noción. Las aplicaciones criptográficas de los extractores de aleatoriedad abarcan desde la construcción de generadores pseudoaleatorios a partir de funciones unidireccionales hasta el diseño de funcionalidad criptográfica a partir de fuentes ruidosas y débiles (incluidas aplicaciones a la criptografía cuántica) hasta los avances más recientes en áreas como la criptografía resistente a fugas y exposición, el cifrado circular, el cifrado totalmente homomórfico, etc. Los extractores de aleatoriedad también han encontrado importantes usos criptográficos en aplicaciones prácticas, particularmente para la construcción de funciones de derivación de claves. En muchas de estas aplicaciones, la propiedad que define a los extractores de aleatoriedad, a saber, la proximidad estadística de su salida a una distribución uniforme, puede flexibilizarse y sustituirse por la indistinguibilidad computacional. Los extractores que ofrecen esta garantía flexibilizada se denominan «extractores computacionales». En esta charla, abordaré algunos avances recientes en la comprensión y la aplicabilidad de los extractores computacionales, centrándome especialmente en su papel en la construcción de funciones de derivación clave.
  3. 1 2 3 4 5 6 7 8 9 10 11 12 13 Krawczyk, H.; Eronen, P. (mayo de 2010). «RFC 5869» . Grupo de trabajo de ingeniería de Internet . doi : 10.17487/RFC5869 .
  4. Elaine Barker; Lily Chen; Richard Davis (agosto de 2020). "Publicación especial 800-56C del NIST: Recomendación para métodos de derivación de claves en esquemas de establecimiento de claves" (Documento). Instituto Nacional de Estándares y Tecnología . doi : 10.6028/NIST.SP.800-56Cr2 .
  5. 1 2 Bhati, Amit Singh; Dufka, Antonín; Andreeva, Elena; Roy, Arnab; Preneel, Bart (2024). "Skye: Un KDF rápido basado en PRF en expansión y sus aplicaciones". Actas de la 19.ª Conferencia ACM Asia sobre Seguridad Informática y de las Comunicaciones . Singapur. págs. 1082–1098 . doi : 10.1145/3634737.3637673 . ISBN  979-8-4007-0482-6.{{cite book}}: CS1 mantenimiento: falta el editor de ubicación ( enlace )
  6. Lund, Joshua (2019). "Vista previa de tecnología para la recuperación segura de valor" .
  7. Lund, Joshua (2018). "Vista previa de tecnología: remitente sellado para Signal" . signal.org .
  8. Krawczyk, Hugo (16 de noviembre de 2016). Escuela COST/IACR sobre aleatoriedad: extracción y KDF I. Barcelona: Universidad Pompeu Fabra . El evento tiene lugar a las 6:00 vía youtube.com.
  9. "paquete hkdf" . pkg.go.dev .
  10. "hash_hkdf — Genera una derivación de clave HKDF a partir de una clave de entrada proporcionada" . php.net .
  11. Eastlake, Donald; Hansen, Tony (2011). "Algoritmos de hash seguros de EE. UU. (SHA y HMAC y HKDF basados ​​en SHA)" . IETF .