HMAC

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 31 de agosto de 2017; las comprobaciones requieren 38 ediciones .

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.

Historia

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 .

Aplicación

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 .

Descripción del algoritmo

Notación
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.

  1. Obtener disminuyendo o aumentando la clave al tamaño del bloque (hasta bytes).K0Kb
1.1. Si la longitud de la clave es Kigual al tamaño del bloque, copie sin cambios y vaya al paso 2 K.K0 SI longitud( K ) == b ENTONCES  : K_0 = K TERMINARA SI 1.2. Si la longitud de la clave es Kmayor que el tamaño del bloque, Kaplicamos la función hash a la clave H, obtenemos una Lcadena del tamaño de un byte, agregamos ceros al lado derecho de esta cadena para crear una bcadena del tamaño de un byte, copiamos el resultado en y vaya al paso 2.K0 SI longitud( K ) > b ENTONCES  : x = H( K ) // longitud( x ) == L K_0 = ceros (x, b - L) TERMINARA SI 1.3. Si la longitud de la clave es Kmenor que el tamaño del bloque, agregue ceros en el lado derecho Kpara crear una bcadena del tamaño de un byte, copie el resultado en (por ejemplo, si (en bytes) y (en bytes), luego bytes nulos ( ) se agregará al lado derecho ) y vaya al paso 2.K0length( К ) = 20b = 64К64 - 20 = 440x00 SI longitud( K ) < b ENTONCES  : K_0 = ceros ( K, b - longitud ( K ) ) TERMINARA SI
  1. Obtenga un bloque del tamaño de un byte usando la operación XOR bit a bit ("xor", " " ):Sib
S yo = xor( K 0 , ipad ) = K 0 ipad.
  1. Obtenga un bloque del tamaño de un byte usando la operación XOR bit a bit :Sob
S o = xor( K 0 , opad ) = K 0 opad.
  1. Dividir un mensaje (datos, conjunto de bytes) texten bloques de bbytes de tamaño.
  2. Pegue una cadena (secuencia de bytes) con cada bloque de mensajes .SiМ
  3. Aplique la función hash a la cadena obtenida en el paso anterior Н.
  4. Combine la cadena con la cadena obtenida de la función hash en el paso anterior.SoH
  5. Aplique la función hash a la cadena obtenida en el paso anterior Н.

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

Pseudocódigo

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_FUNCTION

Ejemplos de código

Un 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 ) ) ); }

Ejemplos de trabajo

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") = c6b1d8489a204918643086ce346b86bc

Echemos 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

Paso 2. Realizamos la operación XOR bit a bit con la constante 0x36.

K0 ipad :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636

Paso 3. Pegamos el mensaje original con la cadena recibida en el paso 2.

( K ipad ) || text :
46474445 42434041 4e4f4c4d 4a4b4849
b6b7b4b5 36363636 36363636 36363636
36363636 36363636 36363636 36363636
36363636 36363636 36363636 36363636
48656c6c 6f20576f 726c64

Paso 4. Aplicar la función hash SHA-1 a la cadena obtenida en el paso anterior.

H( ( K ipad ) || text ) :
0d42b899 d804e19e bfd86fc4 4f414045 dfc9e39a

Paso 5. Realice la operación XOR bit a bit con la constante 0x5c.

K0 opad :
2c2d2e2f 28292a2b 24252627 20212223
dcdddedf 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c
5c5c5c5c 5c5c5c5c 5c5c5c5c 5c5c5c5c

Paso 6. Unir el hilo obtenido en el paso 4 con el hilo obtenido en el paso 5.

( 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

Paso 7. Aplicar la función hash SHA-1 a la cadena obtenida en el paso anterior.

HMAC( K, text ) = H( ( K0 opad ) || H( ( K ipad ) || text ) ) :
2e492768 aa339e32 a9280569 c5d02626 2b912431

Salir. Tenemos una cadena HMAC( K, text )de 20 bytes.

Problemas de uso

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í.

Seguridad

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:

  1. En el primer tipo de ataque, podemos considerar las funciones de compresión F como equivalentes a una función hash aplicada a un mensaje que consta de un solo bloque de B bits de longitud. Para ello, la entrada de la función hash es un valor aleatorio de N bits de longitud. Un ataque a una función hash requiere una búsqueda exhaustiva de la clave, que tiene un nivel de complejidad de orden de , o un ataque de "cumpleaños" , que es un caso especial del segundo ataque, como se explica a continuación.
  2. En el segundo tipo de ataque, el atacante busca dos mensajes Мy М', que se obtienen de la misma función hash: H( M ) = H( M' ). Este tipo de ataque también se conoce como ataque de cumpleaños . El nivel de dificultad de este ataque es para un hash de longitud . En base a esto, se cuestiona la seguridad de la función hash MD5 , debido a su nivel de complejidad , que ya no parece imposible con los modernosn[ ¿cuándo? ] tecnologías. ¿Significa esto que una función hash de 128 bits como MD5 no es adecuada para HMAC? La respuesta a esta pregunta es no, lo que se desprenderá de los siguientes argumentos . Al atacar MD5, un atacante puede elegir cualquier conjunto de mensajes y trabajar sin conexión para encontrar colisiones. Dado que el atacante conoce el algoritmo hash y las condiciones iniciales, el atacante puede crear un código hash para cada uno de los mensajes. Sin embargo, al atacar HMAC, el atacante no podrá generar un par ("mensaje", "código") en modo remoto (fuera de línea), ya que el atacante no conoce la clave K. Así, el atacante debe seguir la secuencia de mensajes generados por el HMAC con la misma clave y realizar un ataque sobre ellos. Un código hash de 128 bits requiere bloques o bits generados con la misma clave. Para una conexión de 1 Gbit, sería necesario seguir el flujo de mensajes, si la clave no cambia, durante 150 000 años para tener éxito. Por lo tanto, si la velocidad es esencial, es perfectamente aceptable usar MD5 en lugar de SHA-1 como funciones hash integradas para HMAC.K

Véase también

Fuentes

  • Black W. Protocolos de seguridad en Internet. Moscú: editorial "Peter". 2001. ISBN 5-318-00002-9 (ISBN original en inglés: ISBN 0-13-014249-2 ).
  • RFC 2104 . Krawczyk H., Bellare M., Canetti R. "HMAC: hash con clave para la autenticación de mensajes". febrero de 1997
  • Stallings W. Criptografía y principios y prácticas de seguridad de redes. 2005. ISBN 0-13-187316-4 .

Notas

  1. 1 2 3 4 5 6 7 Krawczyk H., Bellare M., Canetti R. "HMAC: hash con clave para la autenticación de mensajes". RFC 2104 Archivado el 15 de abril de 2021 en Wayback Machine . febrero de 1997
  2. Mihir Bellare, Ran Canetti y Hugo Krawczyk. Funciones hash de codificación para la autenticación de mensajes. 1996. Descargar PDF Archivado el 9 de mayo de 2009 en Wayback Machine .
  3. implementación en Python  (ing.)  (enlace descendente) . - código fuente. Archivado desde el original el 4 de junio de 2012.
  4. Implementación de PHP  (  enlace inaccesible) . - código fuente. Archivado desde el original el 4 de junio de 2012.

Enlaces

  • HMAC  (inglés) .
  • RFC 2104 . HMAC. febrero de 1997
  • RFC 4226 . M'Raihi D., Bellare M., Hoornaert F., Naccache D., Ranen O. " HOTP : un algoritmo de contraseña de un solo uso basado en HMAC". diciembre de 2005
  • Generar HMAC en línea . Generador de HMAC en línea.