这个模块实现了一个通用的接口来实现多个不同的安全哈希和消息摘要算法。包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在因特网 RFC 1321术语“安全散列”和“消息摘要”是可互换的。较旧的算法被称为消息摘要。现代术语是安全哈希。
每种类型的哈希都具有一个命名构造函数(此模块中始终存在的散列算法的构造函数为md5()
,sha1()
,sha224()
,sha256()
,sha384()
和sha512()
)。可以使用update()
方法以类字节对象填充这个对象(通常为字节
)。在连接数据的任何时候,都可以使digest()
或hexdigest()
方法来向它请求摘要。
例一(计算一串数据的MD5):
1 import hashlib 2 3 str1 = b"hello " 4 str2 = b"world" 5 str3 = b"hello world" 6 7 m1 = hashlib.md5() #生成一个md5对象 8 m1.update(str1) #以bytes类型填充md5对象 9 m1.update(str2) 10 m2 = hashlib.md5() 11 m2.update(str3) 12 13 #digest()返回传递给update()方法的数据的摘要。它是一个大小为digest_size的字节对象,包含的字节可以在0到255整个范围。 14 print("m1 hexdigest: ", m1.digest()) 15 print("m2 hexdigest: ", m2.digest()) 16 #hexdigest()类似digest(),但是摘要以2倍长度的字符串对象返回,只包含十六进制数字。这可用于在电子邮件或其它非二进制环境中安全交换数据。 17 print("m1 hexdigest: ", m1.hexdigest()) 18 print("m2 hexdigest: ", m2.hexdigest()) 19 20 21 22 23 24 >>>: 25 m1 hexdigest: b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3' 26 m2 hexdigest: b'^\xb6;\xbb\xe0\x1e\xee\xd0\x93\xcb"\xbb\x8fZ\xcd\xc3' 27 m1 hexdigest: 5eb63bbbe01eeed093cb22bb8f5acdc3 28 m2 hexdigest: 5eb63bbbe01eeed093cb22bb8f5acdc3
注:可以发现,只要数据一样(格式不同),则MD5码相同(即update()是以原来的基础继续生成MD5码,而不是新内容覆盖旧内容)。
只需更改构造函数即可使用不同的安全散列算法,其调用方式与上面的完全一样。
对于一次性数据,有中更精炼的写法,示例如下(其余算法一样):
1 md5 = hashlib.md5(b'hello world') 2 print(md5.hexdigest())
-
hashlib.new
(name[, data]) -
是一个通用构造函数,它接受所需算法的字符串名称作为其第一个参数。它也存在允许访问上面列出的哈希以及您的OpenSSL库可能提供的任何其他算法。命名的构造函数比
new()
快得多,应该是首选。
使用OpenSSL提供的算法使用new()
:
1 h = hashlib.new('ripemd160') 2 h.update(b"hello world") 3 print(h.hexdigest())