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 和摘要 digest 的 msg 的摘要。该函数等效于
HMAC(key, msg, digest).digest()
,但使用优化的 C 或内联实现,对于适合内存的消息速度更快。参数 key、msg 和 digest 的含义与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_cons
、HMAC.inner
和 HMAC.outer
。
此模块还提供以下辅助函数:
- hmac.compare_digest(a, b)¶
返回
a == b
。此函数使用一种旨在防止时间分析的方法,通过避免基于内容的短路行为,使其适用于密码学。a 和 b 必须都是相同类型:要么是str
(仅限 ASCII,例如由HMAC.hexdigest()
返回),要么是类字节对象。备注
如果 a 和 b 的长度不同,或者如果发生错误,时间侧信道攻击理论上可以揭示有关 a 和 b 的类型和长度的信息,但不能揭示它们的值。
在 3.3 版本加入。
在 3.10 版本发生变更: 该函数在可用时内部使用 OpenSSL 的
CRYPTO_memcmp()
。
参见
- 另请参阅
hashlib
模块 提供安全哈希函数的 Python 模块。