15.1. hashlib
—安全散列和消息摘要¶
源代码: Lib/hashlib.py
该模块实现了许多不同的安全散列和消息摘要算法的公共接口。包括FIPS安全散列算法SHA1,SHA224,SHA256,SHA384和SHA512(在FIPS 180-2中定义)以及RSA的MD5算法(在因特网 RFC 1321 中定义)。术语“安全散列”和“消息摘要”是可互换的。较旧的算法称为消息摘要。现代术语是安全散列。
注解
如果你想要adler32或crc32哈希函数,它们在 zlib
模块中可用。
警告
一些算法已知散列冲突缺点,请参见末尾的“另请参见”一节。
15.1.1. 哈希算法¶
有一个构造函数方法为每种类型的 hash 命名。所有返回具有相同简单接口的哈希对象。例如:使用 sha256()
创建SHA-256哈希对象。现在可以使用 update()
方法用 字节状对象 (通常为 bytes
)提供此对象。在任何时候,你可以问它使用 digest()
或 hexdigest()
方法到目前为止所馈送的数据的级联的 digest。
注解
为了更好的多线程性能,Python GIL 在对象创建或更新时为大于2047字节的数据发布。
注解
不支持将字符串对象提供到 update()
,因为哈希在字节上工作,而不是字符。
总是存在于该模块中的散列算法的构造器是 sha1()
,sha224()
,sha256()
,sha384()
,sha512()
,blake2b()
和 blake2s()
。 md5()
通常也可用,虽然如果您使用罕见的“符合FIPS”的Python构建,它可能会丢失。根据您在平台上使用的OpenSSL库,还可以使用其他算法。在大多数平台上,sha3_224()
,sha3_256()
,sha3_384()
,sha3_512()
,shake_128()
,shake_256()
也可用。
3.6 新版功能: SHA3(Keccak)和SHAKE构建体 sha3_224()
,sha3_256()
,sha3_384()
,sha3_512()
,shake_128()
,shake_256()
。
例如,获取字节字符串 b'Nobody inspects the spammish repetition'
的摘要:
>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b"Nobody inspects")
>>> m.update(b" the spammish repetition")
>>> m.digest()
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06'
>>> m.digest_size
32
>>> m.block_size
64
更浓缩:
>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'
-
hashlib.
new
(name[, data])¶ 是一个通用构造函数,它接受所需算法的字符串名称作为其第一个参数。它还允许访问上面列出的哈希以及您的OpenSSL库可能提供的任何其他算法。命名的构造函数比
new()
快得多,应该是首选。
使用 new()
与OpenSSL提供的算法:
>>> h = hashlib.new('ripemd160')
>>> h.update(b"Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'
Hashlib提供以下常量属性:
-
hashlib.
algorithms_guaranteed
¶ 包含保证在所有平台上此模块支持的哈希算法的名称的集合。请注意,“md5”在此列表中,尽管一些上游供应商提供奇怪的“FIPS兼容”Python构建排除它。
3.2 新版功能.
-
hashlib.
algorithms_available
¶ 一组包含运行的Python解释器中可用的哈希算法的名称。这些名称在传递给
new()
时将被识别。algorithms_guaranteed
将始终是子集。相同的算法可能在此集合中以不同的名称多次出现(感谢OpenSSL)。3.2 新版功能.
以下值作为由构造函数返回的哈希对象的常量属性提供:
-
hash.
digest_size
¶ 结果散列的大小(以字节为单位)。
-
hash.
block_size
¶ 哈希算法的内部块大小(以字节为单位)。
哈希对象具有以下属性:
-
hash.
name
¶ 这个哈希的规范名称,始终小写,并且总是适合作为
new()
的参数,以创建此类型的另一个哈希。在 3.4 版更改: 在CPython自成立以来,name属性已存在,但直到Python 3.4未正式指定,因此在某些平台上可能不存在。
哈希对象有以下方法:
-
hash.
update
(arg)¶ 使用对象 arg 更新哈希对象,该对象必须可解释为字节的缓冲区。重复调用相当于具有所有参数串联的单个调用:
m.update(a); m.update(b)
等效于m.update(a+b)
。在 3.1 版更改: 当使用OpenSSL提供的哈希算法时,释放Python GIL以允许其他线程运行,同时对大于2047字节的数据进行哈希更新。
-
hash.
digest
()¶ 返回到目前为止传递给
update()
方法的数据的摘要。这是大小为digest_size
的字节对象,其可以包含从0到255的整个范围中的字节。
-
hash.
copy
()¶ 返回散列对象的副本(“克隆”)。这可以用于有效地计算共享公共初始子串的数据的摘要。
15.1.2. SHAKE变长摘要¶
shake_128()
和 shake_256()
算法提供具有length_in_bits//2到128或256位安全性的可变长度摘要。因此,它们的消化方法需要长度。最大长度不受SHAKE算法的限制。
-
shake.
digest
(length)¶ 返回到目前为止传递给
update()
方法的数据的摘要。这是大小为length
的字节对象,其可以包含从0到255的整个范围中的字节。
15.1.3. 密钥推导¶
密钥推导和密钥拉伸算法被设计用于安全密码哈希。诸如 sha1(password)
的天真算法不能抵抗暴力攻击。好的密码哈希函数必须可调,慢,并包括 盐。
-
hashlib.
pbkdf2_hmac
(hash_name, password, salt, iterations, dklen=None)¶ 该函数提供PKCS#5基于密码的密钥导出函数2.它使用HMAC作为伪随机函数。
字符串 hash_name 是HMAC的哈希摘要算法的所需名称,例如。 ‘sha1’或’sha256’。 password 和 salt 被解释为字节的缓冲区。应用程序和库应该将 password 限制在合理的长度(例如1024)。 salt 应当距离适当的源大约16个或更多个字节,例如。
os.urandom()
。iterations 的数量应该基于散列算法和计算能力来选择。截至2013年,建议至少100,000次迭代的SHA-256。
dklen 是导出密钥的长度。如果 dklen 是
None
,则使用散列算法 hash_name 的摘要大小,例如。 64为SHA-512。>>> import hashlib, binascii >>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000) >>> binascii.hexlify(dk) b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'
3.4 新版功能.
注解
OpenSSL提供了 pbkdf2_hmac 的快速实现。 Python实现使用
hmac
的内联版本。它是大约慢三倍,不释放GIL。
-
hashlib.
scrypt
(password, *, salt, n, r, p, maxmem=0, dklen=64)¶ 该函数提供基于密码的密钥导出函数,如 RFC 7914 中定义的。
password 和 salt 必须是字节状对象。应用程序和库应该将 password 限制在一个合理的长度(例如1024)。 salt 应当是来自适当源的大约16个或更多个字节,例如。
os.urandom()
。n 是CPU/内存成本因子,r 块大小,p 并行化因子和 maxmem 限制内存(OpenSSL 1.1.0默认为32 MB)。 dklen 是导出密钥的长度。
可用性:OpenSSL 1.1+
3.6 新版功能.
15.1.4. BLAKE2¶
BLAKE2采用附加参数,请参阅 hashlib — BLAKE2哈希函数。
参见
- http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
关于安全哈希算法的FIPS 180-2出版物。
- https://en.wikipedia.org/wiki/Cryptographic_hash_function#Cryptographic_hash_algorithms
维基百科文章,其中包含哪些算法具有已知问题的信息,以及关于其使用的内容。
- https://www.ietf.org/rfc/rfc2898.txt
PKCS#5:基于密码的加密规范版本2.0