目录
hashlib
是 Python 内置的一个库,它提供了一个通用的接口来创建不同哈希消息摘要算法的加密散列。哈希函数可以用于许多目的,如数据完整性校验、保护密码和加密。
常见的哈希算法
hashlib
支持多种哈希算法,包括但不限于:
- MD5 (
hashlib.md5()
) - SHA1 (
hashlib.sha1()
) - SHA256 (
hashlib.sha256()
) - SHA512 (
hashlib.sha512()
)
基本用法
要使用 hashlib
创建散列,可以:
import hashlib
# 创建一个新的散列对象,使用想要的哈希算法,这里以 MD5 为例
hash_object = hashlib.md5()
# 更新哈希对象,可以多次调用 update() 方法
hash_object.update(b'Hello, world!')
# 获取十六进制格式的完整散列
hash_hex = hash_object.hexdigest()
print(hash_hex)
哈希大数据
对于大的数据块,你可以分多次更新哈希对象,而不需要一次性加载整个数据。这在处理大文件或大量数据时非常有用:
# 假设我们有一个大文件
file_path = 'path_to_large_file'
# 创建一个新的散列对象
hash_object = hashlib.sha256()
# 以二进制模式打开文件,读取并更新哈希对象
with open(file_path, 'rb') as file:
for chunk in iter(lambda: file.read(4096), b''):
hash_object.update(chunk)
# 获取十六进制格式的完整散列
hash_hex = hash_object.hexdigest()
print(hash_hex)
使用哈希加盐保护密码
在保存用户密码时,通常对密码进行哈希,并加上“盐”(随机数据)以提高安全性:
import os
# 生成一个随机盐
salt = os.urandom(32) # 32 个字节的盐
# 用户的密码
password = 'p@ssw0rd'
# 创建一个新的散列对象,并加上盐
hash_object = hashlib.pbkdf2_hmac('sha256', password.encode(), salt, 100000)
# pbkdf2_hmac 返回的是一个字节字符串,使用 hex() 方法转换为十六进制格式
hash_hex = hash_object.hex()
print(hash_hex)
在上面的例子中,使用了 pbkdf2_hmac
函数,它实现了 PBKDF2 密码哈希算法,其中使用了一个加盐的 HMAC。100000
表示迭代的次数,这个数字越大,生成散列所需的时间越长,攻击者猜测密码的难度也越大。
注意事项
- 由于 MD5 和 SHA1 算法已被证明存在缺陷,更安全的做法是使用 SHA256 或 SHA512。
- 对于密码保护,请使用
hashlib
提供的更安全的函数,如pbkdf2_hmac
,而不是简单的散列算法。hashlib
提供的函数非常适合加密应用,但请注意,它们不提供完整的加密解决方案。在涉及复杂加密需求的场景下,请使用更专业的加密库,如PyCryptodome
或cryptography
。