跳到主要内容

hashlib

哈希函数把任意长度输入映射为固定长度摘要。摘要适合完整性校验和内容寻址,但不能还原原文,也不能替代加密。

计算摘要​

import hashlib

digest = hashlib.sha256(b"hello").hexdigest()
print(digest)

hasher = hashlib.sha256()
hasher.update(b"hello ")
hasher.update(b"world")
print(hasher.digest()) # 原始 bytes

常用算法有 sha256、sha512、sha3_256 和 blake2b。md5、sha1 已不适合安全场景,仅在兼容旧系统且明确接受碰撞风险时使用。可通过 hashlib.algorithms_guaranteed 查看必有算法。

大文件校验​

import hashlib

hasher = hashlib.sha256()
with open("archive.zip", "rb") as file:
for block in iter(lambda: file.read(1024 * 1024), b""):
hasher.update(block)
print(hasher.hexdigest())

分块更新不会把整个文件加载到内存。比较摘要时使用 hmac.compare_digest(),而不是普通字符串比较,以减少时序侧信道。

带密钥摘要与密码​

import hashlib

keyed = hashlib.blake2b(b"message", key=b"secret", digest_size=32)
print(keyed.hexdigest())

带密钥的 BLAKE2 可用于简单消息认证,但协议互操作通常使用 hmac。不要直接 sha256(password) 保存密码;应使用带盐、可调成本的 hashlib.pbkdf2_hmac(),或专门的 scrypt/Argon2 库,并使用随机盐。