哈希函数是一种将任意长度的数据映射到固定长度输出的函数。Python的hashlib模块提供了一组接口,用于计算各种哈希算法的消息摘要,包括常见的MD5和SHA1算法,也包括SHA256、SHA384、SHA512等。现在,我们来详细了解Python hashlib模块的使用。
一、哈希函数的基本用法
哈希函数可以用于数字签名、密码加密、文件完整性校验等场景。使用hashlib模块,可以轻松地做到这些操作。
1.1 计算字符串的哈希值
import hashlib
str = 'Hello, hash!'
md5 = hashlib.md5()
md5.update(str.encode('utf-8'))
print(md5.hexdigest())
sha1 = hashlib.sha1()
sha1.update(str.encode('utf-8'))
print(sha1.hexdigest())
sha256 = hashlib.sha256()
sha256.update(str.encode('utf-8'))
print(sha256.hexdigest())
在上面的例子中,我们使用三种方法计算了字符串 'Hello, hash!' 的 MD5、SHA-1、SHA-256 哈希值,并打印出了十六进制表示的消息摘要。
计算哈希值的流程如下:
- 创建一个消息摘要对象;
- 将消息用 UTF-8 编码转换为字节流,更新消息摘要对象;
- 输出哈希值。
1.2 计算文件的哈希值
import hashlib
with open('test.txt', 'rb') as f:
md5 = hashlib.md5()
while True:
data = f.read(1024 * 4)
if not data:
break
md5.update(data)
print(md5.hexdigest())
在上面的例子中,我们使用了 MD5 算法计算了文件 'test.txt' 的哈希值,并打印出了十六进制表示的消息摘要。
二、哈希函数的高级用法
2.1 HMAC算法
HMAC (Hash-based Message Authentication Code) 算法是基于哈希函数和密钥的消息认证码算法。它可以用于验证消息的完整性和真实性。
import hashlib
import hmac
message = 'Hello, HMAC!'
secret = b'secret'
hmac_md5 = hmac.new(secret, message.encode('utf-8'), digestmod=hashlib.md5)
print(hmac_md5.hexdigest())
sha1 = hashlib.sha1(secret + message.encode('utf-8'))
print(sha1.hexdigest())
在上面的例子中,我们使用了 HMAC 算法和两种哈希函数计算了消息 'Hello, HMAC!' 的哈希值,并打印出了十六进制表示的消息摘要。
计算 HMAC 值的流程如下:
- 创建 HMAC 对象,传入密钥和消息;
- 调用 HMAC 对象的 update() 方法,更新消息,输出哈希值(或调用 digest()、hexdigest() 方法得到哈希值)。
2.2 加盐哈希
将密码进行哈希存储时,单纯使用哈希会遇到「彩虹表」攻击。加盐哈希则是为了防止彩虹表攻击,随机生成一段盐值加到密码上,再一起进行哈希。
import hashlib
import os
password = '123456'
salt = os.urandom(8) # 随机生成 8 字节的盐值
print('Salt:', salt.hex())
# 使用 sha256 计算加盐哈希值
sha256 = hashlib.sha256()
sha256.update(password.encode('utf-8') + salt)
print('Hash:', sha256.hexdigest())
在上面的例子中,我们随机生成了 8 字节的盐值,并将盐值和密码一起使用 SHA-256 算法计算了加盐哈希值。
三、总结
我们通过本篇攻略了解了 Python hashlib 模块的基本用法和高级用法,掌握了如何对字符串和文件进行哈希计算、使用 HMAC 算法进行消息认证码计算、以及如何使用盐值进行加盐哈希。除此之外,还有更多的哈希算法和用法值得我们去探索。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python hashlib模块详情 - Python技术站