【Python快速上手(三十二)】- Python hashlib 模块

Python快速上手(三十二)

Python hashlib 模块

Python 的 hashlib 模块提供了常见的摘要算法,例如 SHA1、SHA224、SHA256、SHA384、SHA512、MD5 等等。摘要算法(也称为哈希函数)是一种将任意长度的输入转化为固定长度输出的算法,输出通常称为哈希值。摘要算法在密码学、数据完整性验证、数字签名等领域有广泛应用。

1. 安装和导入

hashlib 模块是 Python 标准库的一部分,不需要单独安装。可以直接导入使用:

import hashlib

2. 常见哈希函数

hashlib 支持多种常见的哈希函数,每种哈希函数生成的哈希值长度不同。以下是几种常用的哈希函数:

  • MD5:生成128位哈希值,输出32个十六进制字符。已被认为不安全。
  • SHA1:生成160位哈希值,输出40个十六进制字符。已被认为不安全。
  • SHA256:生成256位哈希值,输出64个十六进制字符。
  • SHA512:生成512位哈希值,输出128个十六进制字符。

3. 使用哈希函数

3.1 计算哈希值
以下是计算字符串哈希值的基本用法:

import hashlib

# 创建哈希对象
hash_object = hashlib.md5()
hash_object.update('hello world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)  # 5eb63bbbe01eeed093cb22bb8f5acdc3

update 方法接受字节类型的参数,因此需要将字符串编码为字节类型。常用的编码方式是 utf-8。

3.2 一步计算哈希值
可以在创建哈希对象时直接传入数据:

hash_value = hashlib.md5('hello world'.encode('utf-8')).hexdigest()
print(hash_value)

3.3 不同的哈希函数
可以选择不同的哈希函数:

sha1_hash = hashlib.sha1('hello world'.encode('utf-8')).hexdigest()
print(sha1_hash)  # 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed

sha256_hash = hashlib.sha256('hello world'.encode('utf-8')).hexdigest()
print(sha256_hash)  # b94d27b9934d3e08a52e52d7da7dabfa49d8ee1a2be0a6f733d8fb0e8e00b502

3.4 更新哈希对象
可以多次调用 update 方法更新哈希对象:

hash_object = hashlib.sha256()
hash_object.update('hello'.encode('utf-8'))
hash_object.update(' world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)  # b94d27b9934d3e08a52e52d7da7dabfa49d8ee1a2be0a6f733d8fb0e8e00b502

4. 使用哈希对象的常见方法

哈希对象提供了一些常见的方法:

  • update(data):更新哈希对象,用 data 追加到已有的数据。
  • digest():返回哈希值的字节序列。
  • hexdigest():返回哈希值的十六进制字符串表示。
  • copy():返回哈希对象的副本。

4.1 update 方法
update 方法可以分多次更新哈希对象:

hash_object = hashlib.sha256()
hash_object.update('hello'.encode('utf-8'))
hash_object.update(' world'.encode('utf-8'))
print(hash_object.hexdigest())

4.2 digest 方法
digest 方法返回哈希值的字节序列:

hash_object = hashlib.sha256('hello world'.encode('utf-8'))
hash_value = hash_object.digest()
print(hash_value)  # b'\xb9M\'\xb9\x93M>\x08\xa5.R\xd7\xda}\xab\xfaI\xd8\xee\x1a+\xe0\xa6\xf73\xd8\xfb\x0e\x8e\x00\xb5\x02'

4.3 hexdigest 方法
hexdigest 方法返回哈希值的十六进制字符串表示:

hash_object = hashlib.sha256('hello world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)  # b94d27b9934d3e08a52e52d7da7dabfa49d8ee1a2be0a6f733d8fb0e8e00b502

4.4 copy 方法
copy 方法返回哈希对象的副本:

hash_object1 = hashlib.sha256('hello'.encode('utf-8'))
hash_object2 = hash_object1.copy()
hash_object1.update(' world'.encode('utf-8'))
hash_object2.update(' Python'.encode('utf-8'))

print(hash_object1.hexdigest())  # b94d27b9934d3e08a52e52d7da7dabfa49d8ee1a2be0a6f733d8fb0e8e00b502
print(hash_object2.hexdigest())  # 12a3ee9d212b2f2d8ab07b4a4d9b800bc9c8e6b58058a019d0a6e4b6b8d0bfa1

5. 文件的哈希值

5.1 计算文件的哈希值
可以读取文件内容并计算哈希值:

def calculate_file_hash(file_path, hash_function):
    hash_object = hash_function()
    with open(file_path, 'rb') as f:
        while chunk := f.read(8192):
            hash_object.update(chunk)
    return hash_object.hexdigest()

file_path = 'example.txt'
print(calculate_file_hash(file_path, hashlib.md5))
print(calculate_file_hash(file_path, hashlib.sha256))

5.2 验证文件完整性
计算文件的哈希值可以用于验证文件完整性。例如,在文件传输过程中计算哈希值并进行比较,以确保文件未被篡改。

6. 安全性考虑

虽然 MD5 和 SHA1 曾经广泛使用,但它们已被认为不够安全。现代应用程序应使用 SHA256 或更高级的哈希函数。

6.1 防止哈希碰撞
哈希碰撞是指两个不同的输入生成相同的哈希值。选择安全的哈希算法(如 SHA256)可以降低碰撞风险。

6.2 密码存储
在存储用户密码时,应使用加盐哈希算法来增强安全性。Python 提供了 hashlib.pbkdf2_hmac 函数来实现加盐哈希:

import os
import hashlib

def hash_password(password):
    salt = os.urandom(16)
    key = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)
    return salt + key

def verify_password(stored_password, provided_password):
    salt = stored_password[:16]
    stored_key = stored_password[16:]
    provided_key = hashlib.pbkdf2_hmac('sha256', provided_password.encode('utf-8'), salt, 100000)
    return provided_key == stored_key

stored_password = hash_password('my_secure_password')
print(verify_password(stored_password, 'my_secure_password'))  # True
print(verify_password(stored_password, 'wrong_password'))  # False

7. 高级用法

7.1 HMAC
HMAC(Hash-based Message Authentication Code)使用哈希函数和密钥生成消息认证码。Python 的 hashlib 模块提供了 hmac 子模块:

import hmac

def generate_hmac(key, message, hash_function):
    return hmac.new(key.encode('utf-8'), message.encode('utf-8'), hash_function).hexdigest()

key = 'my_secret_key'
message = 'Hello, HMAC!'
hmac_value = generate_hmac(key, message, hashlib.sha256)
print(hmac_value)

7.2 BLAKE2
BLAKE2 是一种新型的哈希算法,比 MD5 和 SHA 家族更快更安全。Python 的 hashlib 模块提供了对 BLAKE2 的支持:

hash_object = hashlib.blake2b()
hash_object.update('hello world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)

8. 其他哈希函数

除了 MD5 和 SHA 系列,hashlib 还支持其他哈希函数:

SHA224:SHA256 的截断版,生成224位哈希值。
SHA384:SHA512 的截断版,生成384位哈希值。
SHA3:SHA3 系列,包括 SHA3_224、SHA3_256、SHA3_384 和 SHA3_512。
BLAKE2b 和 BLAKE2s:新型哈希函数,分别生成64字节和32字节哈希值。
8.1 使用 SHA3 系列

hash_object = hashlib.sha3_256()
hash_object.update('hello world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)

8.2 使用 BLAKE2 系列

hash_object = hashlib.blake2s()
hash_object.update('hello world'.encode('utf-8'))
hash_value = hash_object.hexdigest()
print(hash_value)

9. 小结

本文详细介绍了 Python hashlib 模块的使用,包括常见哈希函数的用法、哈希对象的常见方法、计算文件哈希值、哈希算法的安全性考虑、HMAC、BLAKE2 和其他高级用法。hashlib 模块是一个功能强大且易于使用的工具,适用于各种需要生成哈希值的应用场景。通过掌握 hashlib 模块的使用方法,可以有效地进行数据验证、密码存储、消息认证等操作,从而增强应用程序的安全性。

  • 38
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值