hashlib
模块实现了多种哈希算法,包括MD5以及SHA家族的算法,通过algorithms_guaranteed
可以查看hashlib
中封装的所有算法
>>> from pprint import pprint
>>> pprint(hashlib.algorithms_guaranteed)
{'blake2b',
'blake2s',
'md5',
'sha1',
'sha224',
'sha256',
'sha384',
'sha3_224',
'sha3_256',
'sha3_384',
'sha3_512',
'sha512',
'shake_128',
'shake_256'}
整理如下
构造器 | |
---|---|
md5 | md5 |
sha家族 | sha1 , sha224 , sha256 , sha384 , sha512 |
sha3家族 | sha3_224 , sha3_256 , sha3_384 , sha3_512 , |
BLAKE2 | blake2b , blake2s |
shake | shake_128 , shake_256 |
这些哈希算法拥有相同的外部接口,以md5
为例,调用方式大致为
import hashlib
x = hashlib.md5()
x.update(b"tinycool")
x.hexdigest()
# '90cba0172a608c7d3784ba159e6a9ef1'
x.digest()
# b'\x90\xcb\xa0\x17*`\x8c}7\x84\xba\x15\x9ej\x9e\xf1'
其中,update
表示以二进制字符串作为密钥进行哈希,digest
和hexdigest
分别表示将生成的哈希码通过二进制和十六进制的形式表现出来。
md5
算法,MD即信息摘要(Message-Digest),md5
可以理解为第五代信息摘要算法,于1992年公开,用以取代md4
,但在2004年已经被证实无法防止碰撞,从而不适用于安全性认证,但目前来说还是有人在用。
相比之下,SHA,即安全散列算法(Secure Hash Algorithm),是美国政府的加密标准,相对来说更加安全。其中sha1
生成160bit
长度的信息摘要,其他SHA函数,以sha224
为例,224表示产生的信息摘要长度为224bit
,以此类推。
blake2b
和blake2s
分别针对64位操作系统和32位操作系统进行优化,以生成最长64位和最长32位的位数可变的信息摘要。
shake_128
和shake_256
可生成位数可变的信息摘要,二者的最大位数分别是128和256位。
通过new
函数,可以更加统一地生成哈希对象,例如
x = hashlib.new('sha256')
x.update(b"tinycool")
x.hexdigest()
# '96d424d9d77972f28b5a11e8c2bddd67542e7784e01b7dcca51154babb2b54ea'
即hashlib.new('xxx')
和hashlib.xxx()
是相同的,当然xxx
得是haslib
中封装好的哈希函数。
接下来演示一下shake_128
函数
x = hashlib.new('shake_128')
x.update(b"tinycool")
x.hexdigest(15)
# '8f8f153833e5159d548f4371af9855'
x.hexdigest(25)
# '8f8f153833e5159d548f4371af9855e0affc9ddae8d6c98bee'
可见,在hexdigest
中输入不同的长度,返回了不同长度的十六进制字符串。
通过new
创建的哈希对象,有三个可调用的属性
digest_size
哈希对象的字节数。block_size
哈希算法内部块的字节数。name
哈希算法名字