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 库,并使用随机盐。