提供多种哈希算法的模块。
哈希算法:又叫摘要算法,是一种给定输入计算出一种特殊的结果。哈希算法不可逆,比如输入一串字符串,输出一串奇怪的字符串,无法根据输出反向算出输入(除了暴力穷举破解)。
哈希算法可以用于校验文件一致性,对多个文件使用相同的哈希算法,若得到的结果相同,则表示文件完全相同,没有丢失或修改数据。
哈希算法有如下:
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对象