python——hashlib模块

提供多种哈希算法的模块。

哈希算法:又叫摘要算法,是一种给定输入计算出一种特殊的结果。哈希算法不可逆,比如输入一串字符串,输出一串奇怪的字符串,无法根据输出反向算出输入(除了暴力穷举破解)。

哈希算法可以用于校验文件一致性,对多个文件使用相同的哈希算法,若得到的结果相同,则表示文件完全相同,没有丢失或修改数据。

哈希算法有如下:
md5
sha1,sha224, sha256, sha384, sha512,
blake2b, blake2s
sha3_224, sha3_256, sha3_384, sha3_512
shake_128, shake_256……

在该模块中,以上算法都是类,可以调用产生相应的hash对象。

其中md5和sha1较常见,但是都可能发生碰撞。sha384 和sha512 在32位的平台上会较慢。
碰撞:不同的输入产生了相同的Hash结果。

该模块产生的hash对象具有以下四种方法

-update(data):对输入字节更新哈希对象。更新不是替换,重复调用和将所有输入字符串拼起来一次性调用,产生相同结果。
-digest():返回update方法中输入的hash结果,为bytes对象。
-hexdigest():与digest()类似,但是仅包含十六进制数字,长度是digest结果的两倍。
-copy():复制哈希对象并返回,可用于计算公共初始子字符串的数据hash结果。

用法举例

上文中已列举出了hashlib模块中的类(哈希算法),因为这些类的使用方法相同,下文仅以md5算法作为示例。

注意:若输入字符串,需要编码。因为字符串是unicode对象,无法直接使用哈希算法!在字符串前加上b,将该字符串类型转为bytes类型,等价于使用‘utf-8’编码。

import hashlib
password= hashlib.md5()
password.update(b"abcdef123")   #即:'abcdef123'.encode('utf-8')
password.digest()     #b'\xaa|\x9c\x12\xfct\tU\xefM\xfa\xd6p%\x0f\xf4'
password.update(b"xyz")   #和password.update(b"abcdef123xyz")产生的hash对象相同

#也可以用如下方法直接输入文本
password=hashlib.md5('abcdef123'.encode('gbk'))    #字符串输入时需要编码
password.hexdigest()  #aa7c9c12fc740955ef4dfad670250ff4      32位
password.digest()     #b'\xaa|\x9c\x12\xfct\tU\xefM\xfa\xd6p%\x0f\xf4'    16位

由以上输出可知,相同字符串编码方式不同,使用相同的hash算法产生的对象相同。

使用哈希算法时,对密码加盐是一种加强安全性的手段,可以防止暴力破解明文密码。

import hashlib
password='abcdef123'   #原密码
salt='tgrcxn'   
salted_password=password+salt
hashlib.md5(salted_password.encode('ascii')).hexdigest()  #对加盐的密码获得hash对象
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章