在Python开发中,数据加密是常见需求,SHA256和MD5作为常用的哈希算法,常被用于数据校验、密码存储等场景。Python内置的hashlib模块提供了多种哈希算法的实现,不需要额外安装第三方库就可以完成SHA256和MD5加密操作。

hashlib模块简介
hashlib是Python的标准库模块,封装了常见的哈希算法,包括MD5、SHA1、SHA256、SHA512等。哈希算法的作用是将任意长度的数据转换为固定长度的哈希值,且原始数据发生微小变化,哈希值也会发生巨大变化,因此常用于数据完整性校验、密码存储等场景。
MD5加密实现
MD5算法生成的哈希值长度为128位,通常表示为32位十六进制字符串。使用hashlib实现MD5加密的步骤如下:
- 导入hashlib模块
- 创建MD5哈希对象
- 传入需要加密的数据,注意数据需要是字节类型
- 获取哈希值结果
下面是具体的代码示例:
import hashlib
# 待加密的原始数据
data = "hello world"
# 创建MD5哈希对象,传入字节类型数据,需要先编码
md5_obj = hashlib.md5(data.encode("utf-8"))
# 获取十六进制格式的哈希值
md5_result = md5_obj.hexdigest()
print(f"MD5加密结果:{md5_result}")
运行上述代码,输出的MD5加密结果为5eb63bbbe01eeed093cb22bb8f5acdc3。
SHA256加密实现
SHA256属于SHA-2系列算法,生成的哈希值长度为256位,通常表示为64位十六进制字符串,安全性比MD5更高。使用hashlib实现SHA256加密的步骤和MD5类似,只是创建哈希对象时选择对应的算法即可。
具体代码示例如下:
import hashlib
# 待加密的原始数据
data = "hello world"
# 创建SHA256哈希对象
sha256_obj = hashlib.sha256(data.encode("utf-8"))
# 获取十六进制格式的哈希值
sha256_result = sha256_obj.hexdigest()
print(f"SHA256加密结果:{sha256_result}")
运行上述代码,输出的SHA256加密结果为b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9。
两种加密方式的对比
MD5和SHA256的特点对比如下:
| 对比项 | MD5 | SHA256 |
|---|---|---|
| 哈希值长度 | 128位(32位十六进制) | 256位(64位十六进制) |
| 安全性 | 较低,已被证明存在碰撞漏洞 | 较高,目前暂无有效的碰撞攻击方法 |
| 运算速度 | 更快 | 相对较慢 |
| 适用场景 | 非安全场景的数据校验,如文件完整性校验 | 安全场景的密码存储、数据签名等 |
使用注意事项
- hashlib的所有哈希算法都只接受字节类型的数据,传入字符串时需要先调用
encode方法转换为字节,常用的编码格式为utf-8。 - 如果需要加密的数据量较大,可以分多次调用
update方法传入数据,最终调用hexdigest获取结果,效果和一次性传入全部数据一致。 - 哈希算法是单向的,无法通过哈希值反推原始数据,因此适合存储密码的哈希值而非明文,但MD5不建议用于密码存储,优先选择SHA256或更安全的算法。
- 如果需要加盐处理提升密码存储的安全性,可以在原始数据前或后拼接盐值再传入哈希算法,例如
hashlib.sha256((data + salt).encode("utf-8")).hexdigest()。
分块数据加密示例
当处理大文件时,一次性读取全部内容到内存可能会造成内存占用过高,此时可以分块读取文件内容并更新哈希对象,示例如下:
import hashlib
def get_file_sha256(file_path):
# 创建SHA256哈希对象
sha256_obj = hashlib.sha256()
# 分块读取文件,每块大小为8192字节
with open(file_path, "rb") as f:
while chunk := f.read(8192):
sha256_obj.update(chunk)
# 返回哈希值
return sha256_obj.hexdigest()
# 调用函数获取文件的SHA256值
file_hash = get_file_sha256("test.txt")
print(f"文件SHA256值:{file_hash}")