hashlib
hashlib — Secure hashes and message digests
2.5版本中的新功能。
源代码:
Lib / hashlib.py
该模块实现了许多不同安全散列和消息摘要算法的通用接口。包括FIPS安全哈希算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在Internet RFC 1321中
定义)。术语安全哈希和消息摘要是可以互换的。较早的算法被称为消息摘要。现代术语是安全散列。
注意
如果您需要adler32或crc32哈希函数,则它们在zlib
模块中可用。
警告
一些算法已知散列冲突弱点,请参阅最后的“另请参见”部分。
有一种为每种类型的散列
命名的构造函数方法。所有返回一个具有相同简单接口的哈希对象。例如:用于sha1()
创建一个SHA1哈希对象。您现在可以使用该update()
方法为任何字符串提供此对象。在任何时候,您都可以使用or 方法向它提供输入到它的字符串的摘要摘要
。digest()hexdigest()
散列算法,总是存在该模块中的构造是md5()
,sha1()
,sha224()
,sha256()
,sha384()
,和sha512()
。根据Python在您的平台上使用的OpenSSL库,还可以使用其他算法。
例如,要获取字符串的摘要'Nobody inspects the spammish repetition'
:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64
更浓缩:
>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
new()
将所需算法的字符串名称作为其第一个参数的泛型构造函数也存在以允许访问上面列出的散列以及OpenSSL库可能提供的任何其他算法。命名的构造函数比它更快new()
并且应该是首选。
使用new()
OpenSSL提供的算法:
>>> h = hashlib.new('ripemd160')
>>> h.update("Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
该模块提供了以下常量属性:
hashlib.algorithms
一个元组提供了保证这个模块支持的哈希算法的名字。
2.7版本的新功能。
hashlib.algorithms_guaranteed
包含散列算法名称的集合保证在所有平台上由该模块支持。
2.7.9版本的新功能。
hashlib.algorithms_available
包含正在运行的Python解释器中可用的哈希算法名称的集合。传递给这些名称将被识别new()
。algorithms_guaranteed
将永远是一个子集。相同的算法可能会在不同的名称下出现多次(感谢OpenSSL)。
2.7.9版本的新功能。
以下值作为构造函数返回的哈希对象的常量属性提供:
hash.digest_size
结果散列的大小(以字节为单位)。
hash.block_size
散列算法的内部块大小(以字节为单位)。
哈希对象具有以下方法:
hash.update(arg)
用字符串arg
更新散列对象。重复的调用相当于所有参数串联的单个调用:m.update(a m.update(b)相当
于m.update(a+b)。
在2.7版本中进行了更改:释放Python GIL以允许其他线程运行,同时使用由OpenSSL提供的散列算法对大于2048字节的数据进行散列更新。
hash.digest()
返回传递给该update()
方法的字符串的摘要。这是一串digest_size
可能包含非ASCII字符的字节,包括空字节。
hash.hexdigest()
就像digest()
除了摘要以双倍长度的字符串形式返回,只包含十六进制数字。这可以用于在电子邮件或其他非二进制环境中安全地交换该值。
hash.copy()
返回散列对象的副本(“克隆”)。这可用于有效计算共享初始子字符串的字符串摘要。
1.重点推导
密钥派生和密钥扩展算法是为安全密码散列而设计的。天真的算法sha1(password)
不能抵抗强力攻击。一个好的密码哈希函数必须是可调的,速度慢,并且包含一个salt。
hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None)
该函数提供了PKCS#5基于密码的密钥导出函数2.它使用HMAC作为伪随机函数。
字符串名称
是HMAC散列摘要算法的所需名称
,例如'sha1'或'sha256'。密码
和salt
被解释为字节的缓冲区。应用程序和库应该将密码
限制为合理的值(例如1024)。盐
应该来自合适来源的大约16或更多字节,例如os.urandom()
。
应根据散列算法和计算能力来选择轮
次数。截至2013年,建议至少有100,000轮
SHA-256。
dklen
是派生键的长度。如果dklen
是None
散列算法名称
的摘要大小,例如SHA-512为64。
>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'
2.7.8版本的新功能。
注意
OpenSSL提供了pbkdf2_hmac
的快速实现。Python实现使用一个内联版本hmac
。它大约慢了三倍,并且不释放GIL。