定义
hashlib是Python标准库中的一个模块,为多种安全哈希与消息摘要算法提供统一的调用接口[1]。它所包含的算法有FIPS标准定义的安全哈希算法SHA1、SHA224、SHA256、SHA384、SHA512以及SHA-3系列,还包括较早的MD5算法[3]。在术语上,「安全哈希」与「消息摘要」含义相同,早期算法多称为消息摘要,现代通行叫法是安全哈希[4]。
该模块自诞生起就随Python解释器一同发布,开发者通过import hashlib即可调用,不必另行安装第三方组件[2]。
原理
哈希算法把任意长度的输入字节串映射为固定长度的摘要。hashlib为每类算法提供一个与其同名的构造器,例如用sha256()建立一个SHA-256哈希对象,再用update()方法投喂数据,最后通过digest()或hexdigest()取得截至目前所有输入串联后的摘要值[3]。多次调用update()与一次传入全部数据等价,即m.update(a)后接m.update(b)等同于m.update(a+b)[5]。digest()返回原始字节,hexdigest()返回双倍长度、仅含十六进制字符的字符串[4]。
update()只接受类字节对象,不支持直接传入字符串,因为哈希运算针对字节而非字符,字符串需先行编码[4]。为提高多线程场景下的效率,当单次传入的数据超过2047字节时,CPython会释放全局解释器锁,使其他线程得以运行[5]。哈希对象还有copy()方法,可用于对共享同一前缀的多段数据分别计算摘要。
flowchart LR
A[输入字节串] --> B[update 投喂数据]
B --> C[哈希对象内部状态]
C --> D[digest 原始字节]
C --> E[hexdigest 十六进制字符串]
发展历程
hashlib于Python 2.5版本引入,其模块作者为Gregory P. Smith,目的是用统一接口取代当时彼此分离的md5模块与sha模块。在随后的版本中,模块不断扩充算法支持:SHA-3与SHAKE在CPython链接的OpenSSL提供相应实现时被启用[3]。
Python 3.2新增了algorithms_guaranteed与algorithms_available两个常量集合,前者列出所有平台都保证支持的算法名,后者列出当前解释器实际可用的算法名[5]。Python 3.6加入scrypt函数[2]。Python 3.9起,所有hashlib构造器都接受仅限关键字的参数usedforsecurity,默认值为True,置为False时可在受限环境中使用被标记为不安全或被禁用的算法[3]。自Python 3.12起,对于所链接的OpenSSL未提供的MD5、SHA1、SHA2或SHA3算法,模块回退使用HACL*项目中经过验证的实现[3]。
应用
最常见的用途是计算数据的哈希指纹,以校验完整性。由于相同输入必得相同摘要,而任一比特的改变都会使输出完全不同,比对摘要即可判断文件或数据是否被改动[6]。处理大文件时可以分块读取并反复调用update(),避免一次性把整个文件载入内存[7]。
在口令存储方面,模块提供pbkdf2_hmac与scrypt两种密钥派生函数,通过加盐和大量迭代来增加暴力破解成本[1]。BLAKE2系列的blake2b与blake2s支持密钥模式,可用作HMAC更快速、更简单的替代,网络应用可借此对下发给用户的Cookie做对称签名并在之后验证是否被篡改[2]。
局限
部分算法存在已知的碰撞弱点。MD5与SHA-1都已被证明可以构造出摘要相同的不同消息,因此不宜再用于安全场景[3]。SHA-1的实际碰撞在2017年被公开演示[6]。
可用算法并非完全由Python自身决定,而是取决于解释器所链接的OpenSSL库,部分算法只能在某些平台上通过new()按名称访问[1]。模块也不涵盖全部常见校验算法,若需要adler32或crc32,应改用zlib模块[3]。此外,pbkdf2_hmac与scrypt在Python仅用OpenSSL编译时方可使用,其中scrypt早先的纯Python实现已被移除[2]。在32位平台上,SHA-384与SHA-512的运算速度较慢。
参见
参考资料
- hashlib — Secure hashes and message digests [引用日期2026-10-14]
- hashlib — Secure hashes and message digests [引用日期2026-10-14]
- hashlib --- 安全雜湊與訊息摘要¶ [引用日期2026-10-14]
- hashlib [引用日期2026-10-14]
- hashlib [引用日期2026-10-14]
- Hashlib-Module [引用日期2026-10-14]
- Python 中的 hashlib 模块 [引用日期2026-10-14]