Python3 hashlib 模块
在 Python3 中,
hashlib模块提供了一系列加密哈希算法的实现,用于计算数据的哈希值。哈希算法(又称散列算法)通过将任意长度的输入数据转换为固定长度的输出(哈希值),具有单向性(无法从哈希值反推原始数据)和唯一性(不同数据大概率产生不同哈希值)的特点,常用于数据校验、密码存储、数字签名等场景。
一、基本用法
hashlib的核心流程是:创建哈希对象 → 更新数据 → 获取哈希值。关键说明:
- 哈希算法处理的是字节数据(bytes),因此字符串需先通过
encode()编码为 bytes(如utf-8)。 - 可通过
update()多次传入数据,最终计算的是所有数据的总哈希值(适合分块处理大数据)。 - 哈希值可通过
digest()(返回 bytes 类型)或hexdigest()(返回十六进制字符串,更易读)获取。
二、常用哈希算法及示例
hashlib支持多种主流算法,如md5、sha1、sha256、sha512等(安全性:sha512 > sha256 > sha1 > md5)。1. MD5
import hashlib# 1. 创建MD5哈希对象
md5_hash = hashlib.md5()# 2. 更新数据(需传入bytes类型)
data = "hello world"
md5_hash.update(data.encode("utf-8")) # 字符串编码为bytes# 3. 获取哈希值(十六进制字符串)
print(md5_hash.hexdigest()) # 输出:5eb63bbbe01eeed093cb22bb8f5acdc3
2. SHA-256
import hashlib# 直接传入bytes数据(b前缀表示bytes)
sha256_hash = hashlib.sha256(b"hello world")# 获取哈希值
print(sha256_hash.hexdigest()) # 输出:a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e44b0
3. 分块更新数据(适合大文件)
对于大文件或流式数据,可分多次调用
update()累积数据,避免一次性加载到内存:import hashlibdef calculate_file_hash(file_path, algorithm="sha256"):# 创建指定算法的哈希对象(通过hashlib.new()支持动态指定算法)hash_obj = hashlib.new(algorithm)# 分块读取文件并更新哈希with open(file_path, "rb") as f:while chunk := f.read(4096): # 每次读取4096字节(可调整)hash_obj.update(chunk)return hash_obj.hexdigest()# 示例:计算某文件的SHA-256哈希
print(calculate_file_hash("large_file.zip")) # 输出文件的哈希值
三、重要属性与方法
| 方法 / 属性 | 说明 |
|---|---|
hashlib.new(algorithm) |
创建指定算法的哈希对象(如new("sha3_256")) |
update(data) |
向哈希对象传入数据(data 必须为 bytes) |
digest() |
返回 bytes 类型的哈希值 |
hexdigest() |
返回十六进制字符串类型的哈希值 |
digest_size |
哈希值的字节长度(如 SHA-256 为 32 字节) |
block_size |
算法的块大小(用于内部计算) |
algorithms_available |
系统支持的所有哈希算法列表 |
algorithms_guaranteed |
所有 Python 环境都保证支持的算法列表 |
四、注意事项
- 安全性:
MD5和SHA1已被证明存在安全漏洞,不推荐用于密码存储、数字签名等安全场景,建议使用SHA-256、SHA-512或更先进的SHA3系列。 - 数据类型:必须传入 bytes 类型数据,字符串需先编码(如
str.encode("utf-8")),否则会报错。 - 哈希碰撞:理论上不同数据可能产生相同哈希值(碰撞),但好的算法(如 SHA-256)碰撞概率极低,可忽略。
五、扩展:带密钥的哈希(HMAC)
hashlib常与hmac模块配合使用,实现带密钥的哈希(HMAC),用于身份验证等场景(如 API 签名):import hmac
import hashlibkey = b"my_secret_key" # 密钥(bytes类型)
data = b"hello world" # 待加密数据# 计算HMAC-SHA256
hmac_obj = hmac.new(key, data, digestmod=hashlib.sha256)
print(hmac_obj.hexdigest()) # 输出带密钥的哈希值
通过
hashlib,可以便捷地实现数据哈希计算,满足数据校验、安全存储等需求。实际使用时需根据场景选择合适的算法,并注意数据类型和安全性要求。