Python模块:内置模块hashlib哈希与加密入门
一、开篇:把任意数据变成固定长度的"指纹"
哈希(Hash)函数接受任意长度的数据,输出固定长度的"摘要"——就像数据的指纹。相同的输入永远产生相同的输出,但输出无法反推出输入,输入的任何微小变化都会导致输出完全不同(雪崩效应)。
⌨️ 最简单的例子:
importhashlib# 对字符串做SHA256哈希message="Hello, World!"result=hashlib.sha256(message.encode()).hexdigest()print(f"'{message}'的SHA256:")print(f"{result}")# 输出(64个十六进制字符):# dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f# 同样的输入,永远产生同样的输出result2=hashlib.sha256(message.encode()).hexdigest()print(result==result2)# True# 输入有微小变化——输出完全不同message2="Hello, world!"# w变成小写result3=hashlib.sha256(message2.encode()).hexdigest()print(f"'{message2}'的SHA256:")print(f"{result3}")# 完全不同!二、hashlib支持的算法
importhashlib# 查看支持的算法print("支持的算法:",hashlib.algorithms_guaranteed)# {'sha256', 'sha384', 'sha224', 'sha512', 'sha1', 'md5', 'blake2b', 'blake2s', ...}# 常用算法及输出长度algorithms={"MD5":hashlib.md5,"SHA1":hashlib.sha1,"SHA224":hashlib.sha224,"SHA256":hashlib.sha256,"SHA384":hashlib.sha384,"SHA512":hashlib.sha512,}data="Python hashlib 示例".encode()forname,funcinalgorithms.items():h=func(data)print(f"{name}:{h.digest_size}字节,{h.hexdigest()[:40]}...")# 💡 安全性排名(从低到高):# MD5(已破解,不推荐用于安全)< SHA1(已破解)< SHA256 < SHA512三、基本使用模式
3.1 三种使用方式
importhashlib# 方式一:一次性哈希(数据量小时)result=hashlib.sha256(b"Hello").hexdigest()# 方式二:分步update()(数据量大时,如大文件)h=hashlib.sha256()h.update(b"Hello")h.update(b", ")h.update(b"World!")result=h.hexdigest()# 方式三:一行链式调用result=hashlib.sha256(b"Hello, World!").hexdigest()# 💡 update()是累加的——等价于把数据拼接后一起哈希h1=hashlib.sha256(b"Hello, World!").hexdigest()h2=hashlib.sha256()h2.update(b"Hello, ")h2.update(b"World!")print(h1==h2.hexdigest())# True# digest()返回二进制摘要,hexdigest()返回十六进制字符串h=hashlib.sha256(b"test")print(f"二进制:{h.digest()}")print(f"十六进制:{h.hexdigest()}")3.2 大文件哈希
importhashlibdeffile_sha256(filepath,chunk_size=8192):"""计算文件的SHA256哈希值(适合任意大小文件)"""h=hashlib.sha256()try:withopen(filepath,'rb')asf:whileTrue:chunk=f.read(chunk_size)ifnotchunk:breakh.update(chunk)returnh.hexdigest()exceptFileNotFoundError:returnNone# file_hash = file_sha256("large_video.mp4")# print(f"文件哈希: {file_hash}")# 💡 逐块读取:每次只加载chunk_size字节到内存# 这样即使是几个GB的文件也不会撑爆内存四、实际应用
4.1 密码的加盐哈希存储
importhashlibimportos# ⚠️ 永远不要明文存储密码!# ⚠️ 不要只用哈希存储密码(彩虹表攻击)!# ✅ 正确做法:加盐哈希defhash_password(password,salt=None):"""安全的密码哈希(加盐+多次迭代)"""ifsaltisNone:salt=os.urandom(32).hex()# 随机32字节盐# PBKDF2等效:多次迭代h=hashlib.sha256()h.update(salt.encode())h.update(password.encode())digest=h.hexdigest()# 简单迭代10万次(增加暴力破解成本)for_inrange(100_000):h=hashlib.sha256()h.update(digest.encode())h.update(salt.encode())digest=h.hexdigest()returnf"{salt}${digest}"# 格式:盐$哈希值defverify_password(password,stored):"""验证密码"""salt,_=stored.split("$",1)returnhash_password(password,salt)==stored# 使用hashed=hash_password("my_secret_password")print(f"存储的哈希:{hashed}")print(f"正确密码:{verify_password('my_secret_password',hashed)}")# Trueprint(f"错误密码:{verify_password('wrong_password',hashed)}")# False# 💡 生产环境建议使用专门库:# import bcrypt # pip install bcrypt# import argon2 # pip install argon2-cffi# Python 3.4+标准库有 hashlib.pbkdf2_hmac()4.2 文件完整性校验
importhashlibdefverify_file_integrity(filepath,expected_hash,algorithm="sha256"):"""验证文件完整性——对比哈希值"""h=hashlib.new(algorithm)withopen(filepath,'rb')asf:whileTrue:chunk=f.read(8192)ifnotchunk:breakh.update(chunk)actual_hash=h.hexdigest()is_valid=actual_hash==expected_hashprint(f"文件:{filepath}")print(f"预期哈希:{expected_hash}")print(f"实际哈希:{actual_hash}")print(f"完整性:{'✓ 通过'ifis_validelse'✗ 失败'}")returnis_valid# verify_file_integrity("download.zip",# "abc123def456...", algorithm="sha256")4.3 HMAC:带密钥的哈希
importhmacimporthashlib# HMAC(Hash-based Message Authentication Code)# 带密钥的哈希——验证数据完整性和来源secret_key=b"my_secret_api_key"message=b"important_data"# 创建HMACsignature=hmac.new(secret_key,message,hashlib.sha256).hexdigest()print(f"HMAC签名:{signature}")# 验证HMAC(使用compare_digest防止时序攻击)defverify_hmac(message,signature,secret_key):"""安全地验证HMAC签名"""expected=hmac.new(secret_key,message,hashlib.sha256).hexdigest()returnhmac.compare_digest(expected,signature)print(f"验证通过:{verify_hmac(message,signature,secret_key)}")# Trueprint(f"篡改检测:{verify_hmac(b'hacked',signature,secret_key)}")# False# 💡 HMAC的典型应用:API签名、Cookie签名、JWT五、总结
hashlib是Python数据安全的基础工具。从简单的数据校验到密码安全存储,它都是不可或缺的。
💡核心要点:
- SHA256是安全场景的最低标准——MD5和SHA1已被淘汰
- 密码存储必须加盐——防止彩虹表、相同密码不同哈希
- 大文件逐块处理——用
update()流式哈希 - 数据校验==完整性,HMAC==完整性+认证
- 加密用专门库——
hashlib只管哈希,加密用cryptography库
✅ 记住:hashlib.digest_size字节(长度),hashlib.hexdigest()输出(最常用)。