Articulo de referencia

HMAC

"}"> Generación de HMAC-SHA1 En criptografía , un HMAC (a veces abreviado como código de autenticación de mensajes basado en hash o código de autenticación de mensajes basado en...

Página semiprotegida

Generación de HMAC-SHA1

En criptografía , un HMAC (a veces abreviado como código de autenticación de mensajes basado en hash o código de autenticación de mensajes basado en hash ) es un tipo específico de código de autenticación de mensajes (MAC) que utiliza una función hash criptográfica y una clave criptográfica secreta. Al igual que cualquier MAC, puede utilizarse para verificar simultáneamente la integridad y la autenticidad de los datos de un mensaje. Un HMAC es un tipo de función hash con clave que también puede utilizarse en un esquema de derivación de clave o en un esquema de extensión de clave.

HMAC permite la autenticación mediante un secreto compartido en lugar de utilizar firmas digitales con criptografía asimétrica . Evita la necesidad de una infraestructura de clave pública compleja al delegar el intercambio de claves a las partes comunicantes, quienes son responsables de establecer y utilizar un canal de confianza para acordar la clave antes de la comunicación.

Detalles

Cualquier función hash criptográfica, como SHA-2 o SHA-3 , puede utilizarse en el cálculo de un HMAC; el algoritmo MAC resultante se denomina HMAC- x , donde x es la función hash utilizada (por ejemplo, HMAC-SHA256 o HMAC-SHA3-512). La seguridad criptográfica del HMAC depende de la seguridad criptográfica de la función hash subyacente, del tamaño de su salida hash y del tamaño y la calidad de la clave. [ 1 ]

HMAC utiliza dos pasadas de cálculo de hash. Antes de cada pasada, se utiliza la clave secreta para derivar dos claves: una interna y otra externa. A continuación, la primera pasada del algoritmo de hash produce un hash interno derivado del mensaje y la clave interna. La segunda pasada produce el código HMAC final derivado del resultado del hash interno y la clave externa. De este modo, el algoritmo proporciona una mayor inmunidad contra los ataques de extensión de longitud .

Una función hash iterativa (que utiliza la construcción Merkle-Damgård ) divide un mensaje en bloques de tamaño fijo y los procesa mediante una función de compresión . Por ejemplo, SHA-256 opera con bloques de 512 bits. El tamaño de la salida de HMAC es el mismo que el de la función hash subyacente (por ejemplo, 256 y 512 bits en el caso de SHA-256 y SHA3-512, respectivamente), aunque puede truncarse si se desea.

HMAC no cifra el mensaje. En su lugar, el mensaje (cifrado o no) debe enviarse junto con el hash HMAC. Las partes que poseen la clave secreta volverán a aplicar el hash al mensaje y, si es auténtico, los hashes recibido y calculado coincidirán.

La definición y el análisis de la construcción HMAC se publicaron por primera vez en 1996 en un artículo de Mihir Bellare , Ran Canetti y Hugo Krawczyk , [ 1 ] [ 2 ] y también escribieron RFC 2104 en 1997. [ 3 ] : §2 El artículo de 1996 también definió una variante anidada llamada NMAC (Nested MAC). FIPS PUB 198 generaliza y estandariza el uso de HMAC. [ 4 ] HMAC se utiliza dentro de los protocolos IPsec , [ 2 ] SSH y TLS y para JSON Web Tokens .

Definición

Esta definición se ha tomado de RFC 2104:

HMAC(K,metro)=H((Kopagad)H((Kipagad)metro))K={H(K)si K es mayor que el tamaño del bloqueKde lo contrario{\displaystyle {\begin{aligned}\operatorname {HMAC} (K,m)&=\operatorname {H} {\Bigl (}{\bigl (}K'\oplus opad{\bigr )}\parallel \operatorname {H} {\bigl (}\left(K'\oplus ipad\right)\parallel m{\bigr )}{\Bigr )}\\K'&={\begin{cases}\operatorname {H} \left(K\right)&{\text{si}}\ K{\text{ es mayor que el tamaño del bloque}}\\K&{\text{en otro caso}}\end{cases}}\end{aligned}}}

dónde

H{\displaystyle \operatorname {H} }es una función hash criptográfica.
metro{\displaystyle m}es el mensaje que se va a autenticar.
K{\displaystyle K}es la llave secreta.
K{\displaystyle K'}es una clave del tamaño de un bloque derivada de la clave secreta, K ; ya sea rellenando a la derecha con 0 hasta el tamaño del bloque, o reduciendo primero a un valor menor o igual al tamaño del bloque y luego rellenando a la derecha con ceros.
{\displaystyle \parallel }denota concatenación .
{\displaystyle \oplus }denota la operación OR exclusiva a nivel de bits (XOR).
opagad{\displaystyle opad}es el relleno exterior del tamaño de un bloque, que consiste en bytes repetidos con valor 0x5c.
ipagad{\displaystyle ipad}es el relleno interno del tamaño del bloque, que consiste en bytes repetidos con valor 0x36. [ 3 ] : §2

Implementación

El siguiente pseudocódigo demuestra cómo se puede implementar HMAC. El tamaño del bloque es de 512 bits (64 bytes) cuando se utiliza una de las siguientes funciones hash: SHA-1, MD5, RIPEMD-128. [ 3 ] : §2

La función hmac es la siguiente: key: Bytes // Matriz de bytes message: Bytes // Matriz de bytes que se van a hashear hash: Function // La función hash que se va a utilizar (por ejemplo, SHA-1) blockSize: Integer // El tamaño del bloque de la función hash (por ejemplo, 64 bytes para SHA-1)// Calcular la clave del tamaño del bloque block_sized_key = computeBlockSizedKey(key, hash, blockSize) o_key_pad ← block_sized_key xor [0x5c blockSize] // Tecla con relleno exterior i_key_pad ← block_sized_key xor [0x36 blockSize] // Tecla con relleno interiorreturn hash(o_key_pad ∥ hash(i_key_pad ∥ mensaje))
La función computeBlockSizedKey recibe como entrada: key: Bytes // Matriz de bytes hash: Function // La función hash a utilizar (por ejemplo, SHA-1) blockSize: Integer // El tamaño del bloque de la función hash (por ejemplo, 64 bytes para SHA-1)// Las claves más largas que blockSize se acortan mediante hash si (length(key) > blockSize) entonces clave = hash(clave) // Las claves más cortas que blockSize se rellenan hasta blockSize añadiendo ceros a la derecha. if (length(key) < blockSize) then return Pad(key, blockSize) // Rellena la clave con ceros para que tenga blockSize bytes de longitud.tecla de retorno

Principios de diseño

El diseño de la especificación HMAC se motivó por la existencia de ataques a mecanismos más triviales para combinar una clave con una función hash. Por ejemplo, se podría suponer que la misma seguridad que proporciona HMAC se podría lograr con MAC = H ( clavemensaje ). Sin embargo, este método adolece de una grave vulnerabilidad: con la mayoría de las funciones hash, es fácil añadir datos al mensaje sin conocer la clave y obtener otro MAC válido (" ataque de extensión de longitud "). La alternativa, añadir la clave usando MAC = H ( mensajeclave ), presenta el problema de que un atacante que pueda encontrar una colisión en la función hash (sin clave) también encontrará una colisión en el MAC (ya que dos mensajes m1 y m2 que produzcan el mismo hash proporcionarán la misma condición inicial a la función hash antes de que se aplique la clave añadida, por lo que el hash final será el mismo). Usar MAC = H ( clavemensajeclave ) es mejor, pero varios documentos de seguridad han sugerido vulnerabilidades con este enfoque, incluso cuando se utilizan dos claves diferentes. [ 1 ] [ 7 ] [ 8 ]

No se han detectado ataques de extensión conocidos contra la especificación HMAC actual, definida como H ( claveH ( clavemensaje )), ya que la aplicación externa de la función hash enmascara el resultado intermedio del hash interno. Los valores de ipad y opad no son críticos para la seguridad del algoritmo, pero se definieron de tal manera que presentaran una gran distancia de Hamming entre sí, de modo que las claves interna y externa tendrán menos bits en común. La reducción de seguridad de HMAC sí requiere que difieran en al menos un bit.

La función hash Keccak , que fue seleccionada por NIST como ganadora de la competición SHA-3 , no necesita este enfoque anidado y puede utilizarse para generar un MAC simplemente anteponiendo la clave al mensaje, ya que no es susceptible a ataques de extensión de longitud. [ 9 ]

Seguridad

La robustez criptográfica del HMAC depende del tamaño de la clave secreta utilizada y de la seguridad de la función hash subyacente. Se ha demostrado que la seguridad de una construcción HMAC está directamente relacionada con las propiedades de seguridad de la función hash empleada. El ataque más común contra los HMAC es la fuerza bruta para descubrir la clave secreta. Los HMAC se ven sustancialmente menos afectados por las colisiones que sus algoritmos de hash subyacentes por sí solos. [ 2 ] [ 10 ] [ 11 ] En particular, Mihir Bellare demostró que HMAC es una función pseudoaleatoria (PRF) bajo el único supuesto de que la función de compresión es una PRF. [ 12 ] Por lo tanto, HMAC-MD5 no sufre las mismas debilidades que se han encontrado en MD5. [ 13 ]

RFC 2104 requiere que "las claves de más de B bytes se primero apliquen el hash H ", lo que genera una pseudocolisión confusa: si la clave es más larga que el tamaño del bloque hash (por ejemplo, 64 bytes para SHA-1), entonces HMAC(k, m)se calcula como HMAC(H(k), m). Esta propiedad a veces se plantea como una posible debilidad de HMAC en escenarios de hash de contraseñas: se ha demostrado que es posible encontrar una cadena ASCII larga y un valor aleatorio cuyo hash también será una cadena ASCII, y ambos valores producirán la misma salida HMAC. [ 14 ] [ 15 ] [ 16 ]

En 2006, Jongsung Kim , Alex Biryukov , Bart Preneel y Seokhie Hong demostraron cómo distinguir HMAC con versiones reducidas de MD5 y SHA-1 o versiones completas de HAVAL , MD4 y SHA-0 de una función aleatoria o HMAC con una función aleatoria. Los distinguidores diferenciales permiten a un atacante idear un ataque de falsificación contra HMAC. Además, los distinguidores diferenciales y rectangulares pueden conducir a ataques de segunda preimagen . Con este conocimiento, se puede falsificar HMAC con la versión completa de MD4 . Estos ataques no contradicen la prueba de seguridad de HMAC, sino que proporcionan información sobre HMAC basada en funciones hash criptográficas existentes. [ 17 ]

En 2009, Xiaoyun Wang et al. presentaron un ataque de distinción contra HMAC-MD5 sin usar claves relacionadas. Puede distinguir una instanciación de HMAC con MD5 de una instanciación con una función aleatoria con 2 97 consultas con una probabilidad de 0,87. [ 18 ]

En 2011 se publicó un RFC informativo, el RFC 6151, para resumir las consideraciones de seguridad en MD5 y HMAC-MD5. Para HMAC-MD5, el RFC resume que, si bien la seguridad de la función hash MD5 en sí misma está gravemente comprometida, los ataques conocidos actualmente contra HMAC-MD5 no parecen indicar una vulnerabilidad práctica cuando se utiliza como código de autenticación de mensajes. Sin embargo, también agrega que , para un nuevo diseño de protocolo, no se debe incluir un conjunto de cifrado con HMAC-MD5 . [ 13 ]

En mayo de 2011, se publicó el RFC 6234 que detalla la teoría abstracta y el código fuente para los HMAC basados ​​en SHA. [ 19 ]

Ejemplos

Aquí se muestran algunos valores HMAC, suponiendo una entrada en ASCII de 8 bits y una salida codificada en hexadecimal:

HMAC_MD5("clave", "El rápido zorro marrón salta sobre el perro perezoso") = 80070713463e7749b90c2dc24911e275 HMAC_SHA1("clave", "El rápido zorro marrón salta sobre el perro perezoso") = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 HMAC_SHA256("clave", "El rápido zorro marrón salta sobre el perro perezoso") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 HMAC_SHA512("clave", "El rápido zorro marrón salta sobre el perro perezoso") = b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a 

Véase también

Referencias

  1. 1 2 3 Bellaré, Mihir ; Canetti, Ran; Krawczyk, Hugo (1996). "Introducción de funciones hash para la autenticación de mensajes" (PDF) . págs. 1– 15. CiteSeerX 10.1.1.134.8430 .  
  2. 1 2 3 Bellaré, Mihir; Canetti, Ran; Krawczyk, Hugo (primavera de 1996). "Autenticación de mensajes mediante funciones Hash: la construcción de HMAC" (PDF) . CriptoBytes . 2 (1).
  3. 1 2 3 4 H. Krawczyk; M. Bellare; R. Canetti (febrero de 1997). HMAC: Hashing con clave para autenticación de mensajes . Grupo de trabajo de redes IETF . doi : 10.17487/RFC2104 . RFC 2104 .Informativo. Actualizado por RFC 6151 . 
  4. "FIPS 198-1: El código de autenticación de mensajes basado en hash con clave (HMAC)" . Normas federales de procesamiento de información . 16 de julio de 2008.
  5. "FIPS 180-2 con Aviso de Cambio 1" (PDF) . csrc.nist.gov .
  6. Dworkin, Morris (4 de agosto de 2015). "Estándar SHA-3: Hash basado en permutaciones y funciones de salida extensibles" . Estándares federales de procesamiento de información vía Publicaciones del NIST.
  7. Preneel, Bart ; van Oorschot, Paul C. (1995), MDx-MAC y la construcción de MAC rápidos a partir de funciones hash , Lecture Notes in Computer Science, vol. 963, Berlín-Heidelberg: Springer Verlag, CiteSeerX 10.1.1.34.3855  
  8. ^ Preneel, Bart ; van Oorschot, Paul C. (1995), Sobre la seguridad de dos algoritmos MAC , CiteSeerX 10.1.1.42.8908 
  9. Equipo Keccak. "Equipo Keccak: Diseño y seguridad" . Consultado el 31 de octubre de 2019. A diferencia de SHA-1 y SHA-2, Keccak no presenta la vulnerabilidad de extensión de longitud, por lo que no requiere la construcción anidada de HMAC. En cambio, el cálculo del MAC se puede realizar simplemente anteponiendo la clave al mensaje.
  10. Schneier, Bruce (agosto de 2005). "SHA-1 roto" . Recuperado el 9 de enero de 2009. aunque no afecta a aplicaciones como HMAC donde las colisiones no son importantes
  11. H. Krawczyk; M. Bellare; R. Canetti (febrero de 1997). HMAC: Hashing con clave para autenticación de mensajes . Grupo de trabajo de la red IETF . doi : 10.17487/RFC2104 . RFC 2104 .Informativo. sec. 6. Actualizado por RFC 6151. El ataque más fuerte conocido contra HMAC se basa en la frecuencia de colisiones para la función hash H ("ataque de cumpleaños") [PV,BCK2], y es totalmente impracticable para funciones hash mínimamente razonables. 
  12. Bellare, Mihir. "Nuevas pruebas para NMAC y HMAC: seguridad sin resistencia a colisiones" (PDF) . Journal of Cryptology . Consultado el 15 de diciembre de 2021. Este artículo demuestra que HMAC es una PRF bajo el único supuesto de que la función de compresión también lo es. Esto recupera una garantía basada en pruebas, ya que ningún ataque conocido compromete la pseudoaleatoriedad de la función de compresión, y también ayuda a explicar la resistencia a los ataques que HMAC ha demostrado incluso cuando se implementa con funciones hash cuya (débil) resistencia a colisiones está comprometida.
  13. 1 2 S. Turner; L. Chen (marzo de 2011). Consideraciones de seguridad actualizadas para los algoritmos MD5 Message-Digest y HMAC-MD5 . Grupo de trabajo de ingeniería de Internet . doi : 10.17487/RFC6151 . RFC 6151 .Informativo. Actualiza los RFC 2104 y 1321 . 
  14. "Colisiones de hash PBKDF2+HMAC explicadas · Mathias Bynens" . mathiasbynens.be . Consultado el 7 de agosto de 2019 .
  15. "Aaron Toponce : Rompiendo HMAC" . Archivado del original el 7 de agosto de 2019. Recuperado el 7 de agosto de 2019 . 
  16. "RFC 2104 Errata Retenida para Actualización del Documento · Erdem Memisyazici" . www.rfc-editor.org . Consultado el 23 de septiembre de 2016 .
  17. Kim, Jongsung; Biryukov, Alex; Preneel, Bart; Hong, Seokhie (2006). "Sobre la seguridad de HMAC y NMAC basada en HAVAL, MD4, MD5, SHA-0 y SHA-1" (PDF) . SCN 2006. Springer-Verlag.
  18. Wang, Xiaoyun; Yu, Hongbo; Wang, Wei; Zhang, Haina; Zhan, Tao (2009), Criptoanálisis en HMAC/NMAC-MD5 y MD5-MAC (PDF) , Lecture Notes in Computer Science, vol. 5479, Berlín, Heidelberg: Springer-Verlag , consultado el 15 de junio de 2015. 
  19. Eastlake, Donald; Hansen, Tony (mayo de 2011). Algoritmos de hash seguros de EE. UU. (SHA y HMAC y HKDF basados ​​en SHA) . Grupo de trabajo de ingeniería de Internet . doi : 10.17487/RFC6234 . ISSN 2070-1721 . RFC 6234 . Informativo. Sustituye a RFC 4634. Actualiza RFC 3174 .  
  • Herramienta generadora/probadora de HMAC en línea
  • FIPS PUB 198-1, Código de autenticación de mensajes con hash clave (HMAC). Archivado el 17 de febrero de 2013 en Wayback Machine.
  • Implementación de C HMAC
  • Implementación de HMAC en Python
  • Implementación en Java
  • Implementación de HMAC en Rust
Obtenido de " https://en.wikipedia.org/w/index.php?title=HMAC&oldid=1358176801 "