# `hmac` — Hash con clave para autenticación de mensajes

Código fuente: Lib/hmac.py

Este módulo implementa el algoritmo HMAC como se describe en la RFC 2104.

`hmac.``new`(key, msg=None, digestmod='')

  Retorna un nuevo objeto hmac. key es un objeto bytes o bytearray que proporciona la clave secreta. Si msg está presente, se realiza la llamada al método `update(msg)`. digestmod es el nombre del resumen, constructor o módulo del resumen para el objeto HMAC que se va a usar. Puede ser cualquier nombre adecuado para `hashlib.new()`. Se requiere este argumento a pesar de su posición.

  Distinto en la versión 3.4: El parámetro key puede ser un objeto bytes o bytearray. El parámetro msg puede ser de cualquier tipo soportado por `hashlib`. El parámetro digestmod puede ser el nombre del algoritmo de hash.

  Deprecated since version 3.4, removed in version 3.8: MD5 como resumen por defecto implícito para digestmod está obsoleto. Ahora se requiere el parámetro digestmod. Páselo como un argumento de palabra clave para evitar dificultades cuando no tiene un msg inicial.

`hmac.``digest`(key, msg, digest)

  Retorna el resumen de msg para una clave key secreta y un resumen digest dados. La función es equivalente a `HMAC(key, msg, digest).digest()`, pero utiliza una implementación optimizada en C o inline, que es más rápida para mensajes que caben en memoria. Los parámetros key, msg y digest tienen el mismo significado que en `new()`.

  Un detalle de la implementación de CPython: la implementación optimizada en C solo se usa cuando digest es una cadena de caracteres y el nombre de un algoritmo de resumen, que está soportado por OpenSSL.

  Nuevo en la versión 3.7.

Un objeto HMAC tiene los siguientes métodos:

`HMAC.``update`(msg)

  Actualiza el objeto hmac con msg. Las llamadas repetidas equivalen a una sola llamada con la concatenación de todos los argumentos: `m.update(a); m.update(b)` es equivalente a `m.update(a + b)`.

  Distinto en la versión 3.4: El parámetro msg puede ser de cualquier tipo soportado por `hashlib`.

`HMAC.``digest`()

  Retorna el resumen de los bytes que se pasaron al método `update()` hasta el momento. Este objeto bytes será de la misma longitud que el digest_size del resumen que se pasa al constructor. Puede contener bytes no ASCII, incluyendo bytes NUL.

  Advertencia

  Cuando se compara la salida de `digest()` a un resumen provisto externamente durante una rutina de verificación, se recomienda utilizar la función `compare_digest()` en lugar del operador `==` para reducir la vulnerabilidad a ataques de temporización.

`HMAC.``hexdigest`()

  Como `digest()` excepto que el resumen se retorna como una cadena de caracteres de dos veces la longitud conteniendo solo dígitos hexadecimales. Esto se puede utilizar para intercambiar el valor de forma segura en email u otros entornos no binarios.

  Advertencia

  Cuando se compara la salida de `hexdigest()` a un resumen provisto externamente durante una rutina de verificación, se recomienda utilizar la función `compare_digest()` en lugar del operador `==` para reducir la vulnerabilidad a ataques de temporización.

`HMAC.``copy`()

  Retorna una copia («clon») del objeto hmac. Esto se puede utilizar para calcular de forma eficiente los resúmenes de las cadenas de caracteres que comparten una subcadena de caracteres inicial común.

Un objeto hash tiene los siguientes atributos:

`HMAC.``digest_size`

  El tamaño del resumen HMAC resultante en bytes.

`HMAC.``block_size`

  El tamaño de bloque interno del algoritmo de hash en bytes.

  Nuevo en la versión 3.4.

`HMAC.``name`

  El nombre canónico de este HMAC, siempre en minúsculas, por ejemplo `hmac-md5`.

  Nuevo en la versión 3.4.

Obsoleto desde la versión 3.9: Los atributos no documentados `HMAC.digest_cons`, `HMAC.inner` y `HMAC.outer` son detalles de implementación interna y se eliminarán en Python 3.10.

Este módulo también provee las siguiente funciones auxiliares:

`hmac.``compare_digest`(a, b)

  Retorna `a == b`. Esta función utiliza un enfoque diseñado para prevenir el análisis de temporización evitando el comportamiento de cortocircuito basado en contenido, haciéndolo adecuado para criptografía. a y b deben ser del mismo tipo: ya sea `str` (solo ASCII, como por ejemplo retornado por `HMAC.hexdigest()`), o un objeto tipo binario.

  Nota

  Si a y b son de diferente longitud, o si ocurre un error, un ataque de temporización teóricamente podría revelar información sobre los tipos y longitudes de a y b—pero no sus valores.

  Nuevo en la versión 3.3.

  Distinto en la versión 3.9: La función utiliza `CRYPTO_memcmp()` de OpenSSL internamente cuando está disponible.

Ver también

Módulo `hashlib`

  El módulo de Python que provee funciones de hash seguras.