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

由此可以判定,文件内容已被更新,达到校验文件完整性的目的。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值