hmac — 用于消息认证的密钥哈希算法

源代码: Lib/hmac.py


此模块实现了 RFC 2104 中描述的 HMAC 算法。该接口允许使用任何具有*固定*摘要大小的哈希函数。特别地,可扩展输出函数(如 SHAKE-128 或 SHAKE-256)不能与 HMAC 一起使用。

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

返回一个新的 hmac 对象。key 是一个 bytes 或 bytearray 对象,给出密钥。如果 msg 存在,则会执行 update(msg) 方法调用。digestmod 是 HMAC 对象要使用的摘要名称、摘要构造函数或模块。它可以是任何适用于 hashlib.new() 的名称。尽管它位于参数列表的末尾,但它是必需的。

在 3.4 版本发生变更: 参数 key 可以是 bytes 或 bytearray 对象。参数 msg 可以是 hashlib 支持的任何类型。参数 digestmod 可以是哈希算法的名称。

在 3.8 版本发生变更: digestmod 参数现在是必需的。当没有初始的 msg 时,请以关键字参数的形式传递它,以避免尴尬。

hmac.digest(key, msg, digest)

返回给定密钥 key 和摘要 digestmsg 的摘要。该函数等效于 HMAC(key, msg, digest).digest(),但使用优化的 C 或内联实现,对于适合内存的消息速度更快。参数 keymsgdigest 的含义与 new() 中相同。

CPython 实现细节:只有当 digest 是一个字符串且为 OpenSSL 支持的摘要算法名称时,才会使用优化的 C 实现。

在 3.7 版本加入。

class hmac.HMAC

一个 HMAC 对象具有以下方法:

HMAC.update(msg)

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

在 3.4 版本发生变更: 参数 msg 可以是 hashlib 支持的任何类型。

HMAC.digest()

返回到目前为止传递给 update() 方法的字节串的摘要。此 bytes 对象的长度将与给予构造函数的摘要的 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 版本加入。

在 3.10 版本发生变更: 移除了未在文档中说明的属性 HMAC.digest_consHMAC.innerHMAC.outer

此模块还提供以下辅助函数:

hmac.compare_digest(a, b)

返回 a == b。此函数使用一种旨在防止时间分析的方法,通过避免基于内容的短路行为,使其适用于密码学。ab 必须都是相同类型:要么是 str(仅限 ASCII,例如由 HMAC.hexdigest() 返回),要么是类字节对象

备注

如果 ab 的长度不同,或者如果发生错误,时间侧信道攻击理论上可以揭示有关 ab 的类型和长度的信息,但不能揭示它们的值。

在 3.3 版本加入。

在 3.10 版本发生变更: 该函数在可用时内部使用 OpenSSL 的 CRYPTO_memcmp()

参见

另请参阅 hashlib 模块

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