python应用之内置hashlib库的哈希算法介绍
hashlib 是 Python 的一个内置模块,提供了像 SHA1, SHA256, MD5 等哈希算法。可以接受任意长度的字节数据作为输入,并输出一个固定长度的“哈希值”,通常用于校验数据的完整性。而且该算法是不可逆的,不能通过哈希值反算出原始数据。
使用 hashlib
要使用 hashlib 模块,直接导入它即可。然后通过new方法或者sha256方法等创建一个哈希对象,通过调用该对象的update() 方法来提供要哈希的数据(update方法支持分批提供数据),最后通过调用 hexdigest() 方法来获取十六进制格式的哈希值字符串,或者digest方法获取字节串
常用方法介绍
- new(name,data=b’’)方法:创建一个hash算法对象,name传入的是算法的名字,比如下面中的算法名字,data传入的是原始字节数据,可以默认为空。
('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'shake_128', 'shake_256')
- 算法名字对应的方法:比如sha256(),md5()等,功能同new方法,可传入字节bytes,字节数组bytearray和内存视图对象memoryview。
- update(data)方法:向哈希对象中添加数据(字节数据)。可以多次调用此方法,每次调用都会将提供的数据添加到当前哈希计算中。多次调用 update() 方法等同于一次性调用 update() 并传入所有数据的计算结果。
- digest():返回当前哈希对象计算得到的哈希值,结果为字节串(bytes)。
- hexdigest():与 digest() 方法类似,返回的是十六进制格式的哈希值字符串,而不是字节串。
- copy()方法:返回当前哈希对象的一个浅拷贝。通过复制哈希对象并继续在其上调用 update() 方法,可以避免重复计算初始字符串的哈希值。
示例:使用 SHA-256 算法得到哈希值
import hashlib
#字符串
message = "Hello, world!"
# 创建一个SHA256对象
hash_ins = hashlib.sha256()
#new方法和sha256方法类似,大家都可使用
#hash_object = hashlib.new('sha256')
# 提供字节数据
hash_ins.update(message.encode())
# 获取散列值的十六进制表示
print(f"SHA-256 哈希值: {hash_ins.hexdigest()}")
结果:
SHA-256 哈希值: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3
示例:校验文件的完整性。
定义一个文件,通过open函数打开文件对象,通过read/readline/readlines函数等得到文件内容,通过update方法计算全部文件内容的哈希值。
file = 'config.txt' #文件内容随意填充
with open(file,'rb') as f:
hash_ins = hashlib.sha256 ()
while True:
#每次读取100字节
content = f.read(100)
if content:
hash_ins.update(content)
else:
#当文件读取完毕后,打印最后的哈希值
print(hash_ins.hexdigest())
break
执行后结果:
f07bd7a28481e1bcf378e673bbe5d03b7f8e5bb5cdc7589e32a8a615dfdc2b20
当我们将文件内容更改一个字符后,我们重新执行,结果变成如下:
1cc02b69147493934d0c94c018ab72cca50744188e23f00bf5155c8fe4f2b1d5
由此可以判定,文件内容已被更新,达到校验文件完整性的目的。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。