Implementación de HMAC en Python


HMAC (RFC 2104) se ha implementado en Python. Se utilizó la biblioteca SHA-256 para la función hash.

Resumen de HMAC

HMAC es una técnica criptográfica utilizada para generar un Código de Autenticación de Mensaje (MAC) para la autenticación del remitente y la detección de manipulación del mensaje. HMAC combina una función hash con una clave secreta para producir el MAC.

HMAC tiene las siguientes características:

  • Genera el MAC dependiendo tanto de la clave secreta como del mensaje, por lo que alguien que no conozca la clave secreta no puede calcular el mismo MAC. Esto permite la autenticación del remitente.
  • Al aplicar la función hash dos veces, reduce significativamente la probabilidad de que el MAC coincida incluso si se cambia una parte del mensaje. Esto mejora la capacidad de detectar la manipulación del mensaje.
  • HMAC puede utilizar cualquier función hash. Por ejemplo, se pueden aplicar funciones hash como SHA-256 o MD5 a HMAC.
  • HMAC es una técnica criptográfica irreversible.

Explicación del Procedimiento

Los procedimientos se describen detalladamente en RFC 2104.

Lo necesario para HMAC es la función hash H y la clave secreta K.

Vamos a denotar la longitud del bloque de la función hash H como B bytes y la longitud de salida como L bytes. Para la función hash H = SHA-256, B = 64, L = 32.

Aunque se menciona que K es una clave secreta, no es necesario que sea la clave privada en la criptografía de clave pública. Solo necesita ser una cadena secreta desconocida para otros. RFC 2104 especifica que la longitud de K debe ser al menos la longitud de salida de la función hash. Dado que K realiza operaciones bit a bit con el valor hash, si es más corto que el valor hash, debe rellenarse con el valor especificado para evitar que sea adivinado fácilmente.

El flujo del cálculo de HMAC es el siguiente:

  1. Si la clave secreta K es más larga que la longitud del bloque B de la función hash, convierta K en un valor hash de L bytes utilizando la función hash. Utilice el valor hash generado como la clave secreta K para HMAC.
  2. Si la clave secreta K es más corta que la longitud del bloque B de la función hash, agregue ceros (0x00) al final de K para que tenga en total B bytes.
  3. Calcule el XOR del resultado anterior y el valor repetido B veces (ipad = b'\x36' * B). Esto es una operación bit a bit.
  4. Agregue el mensaje encriptado (arreglo de bits) al resultado anterior.
  5. Convierta el resultado anterior en un valor hash utilizando la función hash H.
  6. Calcule el XOR de la clave secreta y el valor repetido B veces (opad = b'\x5c' * B). Esto es una operación bit a bit.
  7. Agregue el valor hash calculado al XOR obtenido anteriormente.
  8. Convierta el resultado anterior en un valor hash utilizando la función hash H.

Programa

Y aquí está el HMAC (SHA-256) implementado en Python:

Entorno

  • Python 3.10.13

Código

Métodos Alternativos para la Generación de MAC Además de HMAC

Además de HMAC, hay otros métodos para generar un MAC utilizando la función hash Keccak llamada KMAC y utilizando cualquier cifrado de bloques llamado CMAC.