HMAC ( a veces significa código de autenticación de mensajes basado en hash , código de autenticación de mensajes que usa funciones hash , o como código de autenticación de mensajes hash con clave en inglés , código de autenticación de mensajes que usa funciones hash con una clave) - en informática ( criptografía ), uno de los mecanismos para verificar la integridad de la información para garantizar que los datos transmitidos o almacenados en un entorno no confiable no hayan sido modificados por personas no autorizadas (ver hombre en el medio ). El motor HMAC utiliza inserción simulada (MAC) , se describe en RFC 2104 , en los estándares de ANSI , IETF , ISO y NIST . MAC es un estándar que describe cómo intercambiar datos y cómo comprobar la integridad de los datos transmitidos mediante una clave secreta. Dos clientes que utilizan una MAC suelen compartir un secreto compartido. HMAC: complemento sobre MAC; mecanismo para intercambiar datos utilizando una clave secreta (como en MAC) y funciones hash . El nombre puede especificar la función hash utilizada [1] : HMAC- MD5 , HMAC-SH1, HMAC- RIPEMD128 , HMAC - RIPEMD160 , etc.
sido notado[ ¿por quién? ] que las funciones hash (por ejemplo , MD5 , SHA-1 , RIPEMD128 , RIPEMD-160 ) suelen ser más rápidas que los cifrados de bloque simétricos (por ejemplo, DES ). Había un deseo de usar funciones hash en MAC, y la disponibilidad de bibliotecas listas para usar con implementaciones de varias funciones hash solo impulsó esta idea.
Pero no fue posible usar algunas funciones hash en el MAC. Por ejemplo, la función hash MD5 no se puede usar en una MAC, ya que solo toma un argumento: datos (cadena, secuencia de bytes) y no usa una clave secreta.
En junio de 1996 [2] Hugo Krawczyk ( ing. Hugo Krawczyk , empleado de IBM ), Mihir Bellar ( ing. Mihir Bellare , empleado de la Universidad de California en San Diego (UCSD) ) y Ran Cannetti ( ing. Ran Canetti , un empleado de IBM ) publicaron una descripción del mecanismo HMAC, y en febrero de 1997 también publicaron RFC 2104 . En HMAC, los datos se "mezclaron" con la clave y la función hash se aplicó dos veces.
Se han propuesto otros mecanismos para permitir el uso simultáneo de datos y una clave secreta en los algoritmos hash existentes, pero HMAC ha recibido el mayor apoyo. .
Ventajas de HMAC:
El mecanismo HMAC ha sido descrito en los estándares de las organizaciones ANSI , IETF , ISO y NIST .
La implementación de HMAC es obligatoria (es decir , obligatorio implementar ) para el protocolo IPsec .
HMAC también se utiliza en otros protocolos de Internet , como TLS .
función hash H | b, byte | L, byte |
---|---|---|
MD5 | 64 | dieciséis |
SHA-1 | 64 | veinte |
SHA-224 | 64 | 28 |
SHA-256 | 64 | 32 |
SHA-512/224 | 128 | 28 |
SHA-512/256 | 128 | 32 |
SHA-384 | 128 | 48 |
SHA-512 | 128 | 64 |
SHA3-224 | 144 | 28 |
SHA3-256 | 136 | 32 |
SHA3-384 | 104 | 48 |
SHA3-512 | 72 | 64 |
out = H( in ) b = length( in ) L = length( out ) |
El algoritmo HMAC se puede escribir como una sola fórmula [1] : donde:
El esquema del algoritmo HMAC se muestra en las figuras.
Los pasos del algoritmo HMAC se enumeran a continuación.
Las claves más pequeñas que los Lbytes se consideran [1] inseguras ( ing. fuertemente desaconsejadas ). Se recomienda [1] elegir las claves al azar y cambiarlas regularmente. Las claves más grandes que Lbytes, no aumentan significativamente [1] la fuerza de la función, se pueden usar si hay dudas sobre la aleatoriedad de los datos utilizados para crear la clave y recibidos del generador de números aleatorios.
El tamaño de la clave Кdebe ser mayor o igual a L/2bytes .
La figura muestra una implementación [ refinada ] más eficiente del algoritmo HMAC-MD5. La implementación difiere en el uso de . Esta implementación es útil si la mayoría de los mensajes para los que se calcula el MAC son cortos. Función : la función de compresión para la función hash . Toma una variable y un bloque de longitud de bytes como argumentos . divide el bloque en una cadena de enlaces con la longitud de cada enlace en bytes. La función se llama una vez para cada nueva clave. FFHFnbFnF
El siguiente es un ejemplo de implementación de HMAC en pseudocódigo :
FUNCTION hmac(key, msg): // Si el tamaño de la clave es mayor que el tamaño del bloque... IF length(key) > block_size THEN : // Acortar la clave al tamaño del resultado de la función hash clave = hash (clave) // (El tamaño del resultado hash suele ser menor que (no igual) que el tamaño del bloque hash) END_IF // Si la clave es menor que el tamaño del bloque hash... IF length( key ) < block_size THEN : // Complementando la llave con una secuencia cero clave = clave ∥ ceros (tamaño_bloque - longitud (clave)) // el operador "∥" realiza la fusión de cadenas (secuencias de bytes) END_IF ipad = ['\x36' * tamaño_bloque] // el operador "*" indica el número de repeticiones de una secuencia de bytes, // y block_size - el tamaño del bloque de función hash, opad = ['\x5c' * tamaño_bloque] ikeypad = ipad ⊕ tecla // el operador "⊕" realiza OR exclusivo bit a bit (xor) teclado = tecla opad ⊕ RETURN hash(okeypad ∥ hash(ikeypad ∥ msg)) // El operador "∥" empalma cadenas END_FUNCTIONUn ejemplo de la implementación del algoritmo HMAC-MD5 utilizando las funciones de la biblioteca estándar de Python [3] :
import hmac , hashlib print ( hmac . new ( key = b 'secret_shared_key' , msg = open ( 'message.txt' , 'rb' ) . read (), digestmod = hashlib . md5 ) . hexdigest ())Una de las posibles implementaciones del algoritmo HMAC-MD5 en PHP [4] :
función hmac ( $ clave , $ datos ) { $ b = 64 ; // tamaño del bloque según RFC 2104 if ( strlen ( $key ) > $b ) { $key = pack ( "H*" , md5 ( $key ) ); } $clave = str_pad ( $clave , $b , chr ( 0x00 ) ); $ipad = str_pad ( '' , $b , chr ( 0x36 ) ); $opad = str_pad ( '' , $b , chr ( 0x5c ) ); $k_ipad = $tecla ^ $ipad ; $k_opad = $tecla ^ $opad ; return md5 ( $k_opad . pack ( "H*" , md5 ( $k_ipad . $data ) ) ); }Demostremos un ejemplo de cómo funciona el algoritmo para varios datos de entrada.
El primer parámetro es una clave Kde 160 bits (20 bytes). El segundo parámetro es el mensaje textque será enviado por el remitente y autenticado por el destinatario. A la salida, obtenemos un código de autenticación de 160 bits.
HMAC( K, texto ) = HMAC( 0000000000000000000000000000000000000000, "" ) = 740ca4e7a701540b385df12fe57cff57 HMAC( K, texto ) = HMAC( 0000000000000000000000000000000000000000, "Hola Mundo") = a0e026219366a56cf843bd2051831327 HMAC( K, texto ) = HMAC( 0000000000000000000000000000000000000001, "1") = c6b1d8489a204918643086ce346b86bcEchemos un vistazo más de cerca al algoritmo HMAC- SHA1 con una clave de 20 bytes.
Tenemos: un mensaje de texto text = "Hello World"y una clave de 20 bytes en forma hexadecimalK = 0x707172737475767778797a7b7c7d7e7f80818283
Paso 1. Rellene la clave Kcon cero bytes al tamaño del bloque. El tamaño de bloque de una función hash SHA-1 es de 64 bytes.K0:
70717273 74757677 78797a7b 7c7d7e7f
80818283 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
K0 ipad :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
( K ipad ) || text :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
48656c6c 6f20576f 726c64
H( ( K ipad ) || text ) :
0d42b899 d804e19e bfd86fc4 4f414045 dfc9e39a
K0 opad :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
( K0 opad ) || H( ( K ipad ) || text ) :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
0d42b899 d804e19e bfd86fc4 4f414045
dfc9e39a
HMAC( K, text ) = H( ( K0 opad ) || H( ( K ipad ) || text ) ) :
2e492768 aa339e32 a9280569 c5d02626 2b912431
El código de autenticación resultante le permite verificar que los datos no han cambiado de ninguna manera desde que fueron creados, transmitidos o almacenados por una fuente confiable. Para este tipo de verificación, es necesario, por ejemplo, que dos partes que confíen entre sí acuerden de antemano el uso de una clave secreta que solo ellos conocen. Esto garantiza la autenticidad de la fuente y del mensaje. La desventaja de este enfoque es obvia: debe haber dos partes que confíen entre sí.
La seguridad de cualquier función MAC basada en funciones hash integradas depende de la fuerza de la función hash subyacente. El atractivo de HMAC es que sus creadores pudieron demostrar la relación exacta entre la fuerza de las funciones hash integradas y la fuerza de HMAC.
La seguridad de la función de inserción de imitación (MAC) generalmente se expresa en términos de la probabilidad de un ataque exitoso con la cantidad de tiempo invertido en él, así como de recibir un par (mensaje - MAC) creado con la misma clave. En esencia, se demuestra en BELL96a que para un nivel dado de esfuerzo (tiempo, mensaje - MAC) en un mensaje generado por un usuario final, la probabilidad de un ataque exitoso en un HMAC es equivalente a un ataque en un integrado. función hash: