【Python 标准库解读】安全哈希与摘要算法库 — hashlib

欢迎加入 Python 官方文档翻译团队:https://www.transifex.com/python-doc/


hashlib 模块针对不同的安全哈希和消息摘要算法实现了一个通用的接口。提供了常见的摘要算法,如MD5,SHA1等等。

摘要算法又称哈希算法、散列算法,摘要算法是单向加密的,也就是说明文通过摘要算法加密之后,是不能解密的。摘要算法的第二个特点密文是固定长度的,它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。之所以叫摘要算法,它的算法就是提取明文重要的特征。所以,两个不同的明文,使用了摘要算法之后,有可能出现他们的密文的一样,不过这个概率非常的低。

hashlib 模块官方文档:https://docs.python.org/3/library/hashlib.html


部分常用函数:

  • hashlib.new(name[, data]):指定算法,创建一个 hashable 对象

  • hash.update(data):传递类字节参数(通常是bytes)来更新hash对象,重复的调用相当于一个连接了所有参数的调用:m.update(a); m.update(b) 相当于 m.update(a+b)

  • hash.digest():返回摘要,作为二进制数据字符串值

  • hash.hexdigest():返回摘要,作为十六进制数据字符串值


MD5 算法示例

MD5 是常见的摘要算法,而单纯的 MD5 加密并不安全,通过撞库的方式,常见密码的 MD5 值很容易就能查询得到。

使用 hashlib.new() 方法来创建一个 hash 对象:

>>> import hashlib
>>> md5 = hashlib.new('md5', 'I love python!'.encode('utf-8'))
>>> md5.hexdigest()
'21169ee3acd4a24e1fcb4322cfd9a2b8'

也可以使用提供的接口指定具体调用方式:

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update('I love python!'.encode('utf-8'))
>>> md5.hexdigest()
'21169ee3acd4a24e1fcb4322cfd9a2b8'

数据量很大时,可以分块多次调用 update(),最后计算的结果是一样的:

>>> import hashlib
>>> md5 = hashlib.md5()
>>> md5.update('I love '.encode('utf-8'))
>>> md5.update('python!'.encode('utf-8'))
>>> md5.hexdigest()
'21169ee3acd4a24e1fcb4322cfd9a2b8'

SHA1 算法示例

SHA1 是比 MD5 更安全一点的摘要算法,MD5 的密文是 32 位,而 SHA1 是 40 位,SHA1 的升级版还有 SHA256 和 SHA512,版本越强,密文越长,代价是速度越慢。

>>> import hashlib
>>> sha1 = hashlib.new('sha1', 'I love python!'.encode('utf-8'))
>>> sha1.hexdigest()
'23c02b203bd2e2ca19da911f1d270a06d86719fb'

或者:

>>> import hashlib
>>> sha1 = hashlib.sha1()
>>> sha1.update('I love python!'.encode('utf-8'))
>>> sha1.hexdigest()
'23c02b203bd2e2ca19da911f1d270a06d86719fb'

hash.digest() 转化为 hash.hexdigest()

以 MD5 算法为例,首先使用两种方法获取一下字符串 Hello World 的 MD5 值:

>>> import hashlib
>>> md5 = hashlib.new('md5', b'Hello World')
>>> md5.hexdigest()
'b10a8db164e0754105b7a99be72e3fe5'
>>> md5.digest()
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'

使用 binascii 模块的 hexlify() 方法将 md5.digest() 转化为 md5.hexdigest() 结果:

>>> import binascii
>>> md5_hexdigest = binascii.hexlify(b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5')
>>> md5_hexdigest
b'b10a8db164e0754105b7a99be72e3fe5'

hash.hexdigest() 转化为 hash.digest()

使用 binascii 模块的 unhexlify() 方法将 md5.hexdigest() 转化为 md5.digest() 结果:

>>> import binascii
>>> md5_digest = binascii.unhexlify('b10a8db164e0754105b7a99be72e3fe5')
>>> md5_digest
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章