# 15.2. `hmac` — 用于消息验证的加密哈希

源代码： Lib/hmac.py

该模块实现 RFC 2104描述的HMAC算法。

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

  返回一个新的hmac对象。key是一个字节对象或字节数组对象，由它给出密钥。如果存在msg，则调用`update(msg)`方法。digestmod是HMAC对象要使用的摘要名称、摘要构造函数或模块。它支持适配`hashlib.new()`的任何名称，默认为`hashlib.md5`构造函数。

  在版本3.4中的更改：参数key可以是字节或字节数组对象。参数msg可以是`hashlib`支持的任何类型。参数digestmod可以是哈希算法的名称。

  自版本3.4起已弃用：弃用MD5作为digestmod隐含的默认摘要。

HMAC 对象具有以下方法：

`HMAC.``update`(msg)

  使用msg更新hmac对象。重复调用等效于具有所有参数串联的单个调用：`m.update(a); m.update(b)`等效于`m.update(a + b)`。

  在版本3.4中更改：参数msg可以是`hashlib`支持的任何类型。

`HMAC.``digest`()

  返回到目前为止传递给`update()`方法的字节的摘要。此字节对象的长度与向构造函数提供的摘要的digest_size长度相同。它可能包含非ASCII字节，包括NUL字节。

  警告

  在验证例程期间将`digest()`的输出与外部提供的摘要进行比较时，建议使用`compare_digest()`函数代替`==`运算符，以减少定时攻击的脆弱性。

`HMAC.``hexdigest`()

  像`digest()`，除了摘要作为字符串返回两次只包含十六进制数字的字符串。这可用于在电子邮件或其它非二进制环境中安全交换数据。

  警告

  在验证例程期间将`hexdigest()`的输出与外部提供的摘要进行比较时，建议使用`compare_digest()`函数代替`==`运算符，以减少定时攻击的脆弱性。

`HMAC.``copy`()

  返回 hmac 对象的副本（"克隆"）。这可以用于更有效地计算分享一个共同的初始子字符串的字符串的摘要。

哈希对象具有以下属性：

`HMAC.``digest_size`

  所得HMAC摘要的大小（以字节为单位）。

`HMAC.``block_size`

  哈希算法的内部块大小（以字节为单位）。

  新版本3.4。

`HMAC.``name`

  此HMAC的规范名称，始终为小写，例如。`hmac-md5`。

  新版本3.4。

本模块还提供了以下辅助函数：

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

  返回`a == b`。这个函数使用一种防止时序分析的方法，通过避免基于内容的短路行为，使其适合加密。a和b必须都是相同类型：`str`（仅限ASCII，由`HMAC.hexdigest()`）或bytes-like object返回。

  注

  如果a和b长度不同，或者如果发生错误，从理论上讲时序攻击可以揭示a和b的类型和长度等有关的信息 —— 但不能得到它们的值。

  版本3.3中的新功能。

请参见

模块`hashlib`
  提供安全哈希函数的Python 模块