Python中hashlib模块的摘要算法详解
作者:爱吃 香菜
hashlib 模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?
摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算 f(data) 很容易,但通过 digest 反推 data 却非常困难。
而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
示例
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
import hashlib md5 = hashlib.md5() md5.update('my name is leizi'.encode('utf-8')) print(md5.hexdigest())
那么计算出来的md5就是
d7d8c24cddfb4c15b83db713badda3d3
如果数据量很大,可以分块多次调用 update() ,最后计算的结果是一样的:
import hashlib md5 = hashlib.md5() md5.update('my name is leizi'.encode('utf-8')) md5.update(" 欢迎关注伤心的辣条".encode('utf-8')) print(md5.hexdigest())
最后的结果
96f4063331ea2c477fb3d7e980d73404
试试改动一个字母,看看计算的结果是否完全不同。
import hashlib md5 = hashlib.md5() md5.update('my name is leizi1'.encode('utf-8')) md5.update(" 欢迎关注伤心的辣条 ".encode('utf-8')) print(md5.hexdigest())
结果打印
57488933f9d74f5404533d111cbbf4e4
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit/16字节,通常用一个32位的16进制字符串表示。
另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
import hashlib sha1 = hashlib.sha1() sha1.update('my name is leizi '.encode('utf-8')) sha1.update('欢迎关注伤心的辣条'.encode('utf-8')) print(sha1.hexdigest())
结果:
abbe3ae3d30736838602e9d119a2dfe016577a07
常用的属性
hashlib.algorithms #列出所有加密算法 h.digest_size #产生的散列字节大小。 h.block_size #哈希内部块的大小
常用方法
hash.new([arg]) # 创建指定加密模式的hash对象 hash.update(arg) # 更新哈希对象以字符串参数。如果同一个hash对象重复调用该方法,m.update(a); m.update(b) 等价于 m.update(a+b) hash.digest() # 返回摘要,作为二进制数据字符串值。 hash.hexdigest() # 返回摘要,作为十六进制数据字符串值 hash.copy() # 复制
hashlib的特点
1、摘要算法在很多地方都有广泛的应用。
2、要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。
3、它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
一个优秀的 hash 算法,将能实现:
- 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
- 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
- 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
- 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。
除了上面,我们列举的几个,库里还有这些加密方式:
- sha224()
- sha256()
- sha384()
- sha512()
- blake2b()
- blake2s()
- sha3_224
- sha3_256
- sha3_384
- sha3_512
- shake_128
- shake_256
- 等等
主要的应用场景呢,就是我们的密码的加密和明文的加密,按照一定的约定去形成我们的加密的方式即可,有些时候为了避免太过于简单的加密,我们会约定一个私钥,增加加密的复杂性。
在自动化中,我还会用这个产生不一样的文件的名称,这样可以方便在自动化的过程中有区分。
到此这篇关于Python中hashlib模块的摘要算法详解的文章就介绍到这了,更多相关Python的hashlib模块内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!