26.Python基础篇-hashlib模块
hashlib模块介绍
是 Python 标准库中的模块,用于生成各种安全哈希值和消息摘要。它支持多种哈希算法(如 MD5、SHA 系列等),广泛用于数据完整性校验和密码安全场景。
哈希算法
哈希算法:将任意长度的输入数据映射为固定长度的输出值(哈希值),输出值是数据的唯一标识。
哈希算法是不可逆的,只可以加密,无法解密。但是同样的值多次哈希得到的结果是一样的。
hashlib模块支持的算法:
- MD5:
md5()
(不推荐用于密码加密,因已被破解)。 - SHA-1:
sha1()
(较 MD5 更安全,但已不被推荐用于高安全场景)。 - SHA-2 系列:
sha224()
、sha256()
、sha384()
、sha512()
(目前常用,安全性较高)。
基本用法
第一步:创建哈希对象
import hashlib # 使用算法创建哈希对象 hash_obj = hashlib.md5() # MD5 算法 hash_obj = hashlib.sha256() # SHA-256 算法
第二步:更新数据
哈希对象的 update()
方法可以更新待加密数据。数据可以更新多次,最终生成一个哈希值
data = b"Hello, hashlib!" # 数据需为bytes类型 hash_obj.update(data) # update添加待哈希数据 hash_obj.update(b'hello') # 再次update
第三步:获取哈希值
# 两种方式 # 第一种:获取十六进制格式 hex_result = hash_obj.hexdigest() print(hex_result) # e.g., "d91b3f420b9f19e40ac4d2a25ad0b692" # 第二种:获取二进制格式 byte_result = hash_obj.digest() print(byte_result) # e.g., b'\xd9\x1b?B\x0b\x9f\x19\xe4...'
不同哈希算法的介绍:
MD5:速度快,但已不安全,不适用于密码存储或加密场景。
SHA-256:更安全,广泛用于校验文件完整性。
BLAKE2:比 SHA 系列更快,安全性强。
如何选择:
用于密码存储时应使用SHA-256和BLAKE2
用于文件校验可以使用SHA-1或选择更安全的SHA-256或BLAKE2
加盐
加盐的目的:
防止彩虹表攻击
彩虹表是一个预先计算好的哈希值-原文对照表。如果直接对原文进行哈希处理,攻击者可以通过彩虹表轻松找到匹配的原文。
- 加盐后:即使两人使用相同的密码,加盐后的哈希值也完全不同。
防止重复哈希值
相同的密码如果没有加盐,会产生相同的哈希值,暴露用户密码的模式。
- 加盐后:每个密码的哈希值唯一,无法通过重复的哈希值推断密码。
如何加盐:
import hashlib md5 = hashlib.md5() md5.update(bytes('盐', encoding='utf-8')) # 先把盐更新进去。不是必须放在前面,可以随便放。 md5.update(b"password") # 假设password是密码 hex_md5 = md5.hexdigest() print(hex_md5) # fffe343da367b45368df0f90391812b6
应用场景
1.使用哈希值校验文件的完整性
在网络传输或存储过程中,可能会因为信号干扰、硬件故障等原因导致文件损坏。
使用哈希值校验可以检测文件是否因意外原因发生了内容变化。
文件下载后,与官方提供的哈希值(如 MD5、SHA-256)比对,确保文件未被篡改
2.哈希密码用于存储和验证