Skip to main content

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()

3.6 新版功能: blake2b()blake2s()

例如,获取字节字符串 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.hexdigest()

digest(),除了摘要作为双长度的字符串对象返回,只包含十六进制数字。这可以用于在电子邮件或其他非二进制环境中安全地交换值。

hash.copy()

返回散列对象的副本(“克隆”)。这可以用于有效地计算共享公共初始子串的数据的摘要。

15.1.2. SHAKE变长摘要

shake_128()shake_256() 算法提供具有length_in_bits//2到128或256位安全性的可变长度摘要。因此,它们的消化方法需要长度。最大长度不受SHAKE算法的限制。

shake.digest(length)

返回到目前为止传递给 update() 方法的数据的摘要。这是大小为 length 的字节对象,其可以包含从0到255的整个范围中的字节。

shake.hexdigest(length)

digest(),除了摘要作为双长度的字符串对象返回,只包含十六进制数字。这可以用于在电子邮件或其他非二进制环境中安全地交换值。

15.1.3. 密钥推导

密钥推导和密钥拉伸算法被设计用于安全密码哈希。诸如 sha1(password) 的天真算法不能抵抗暴力攻击。好的密码哈希函数必须可调,慢,并包括

hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

该函数提供PKCS#5基于密码的密钥导出函数2.它使用HMAC作为伪随机函数。

字符串 hash_name 是HMAC的哈希摘要算法的所需名称,例如。 ‘sha1’或’sha256’。 passwordsalt 被解释为字节的缓冲区。应用程序和库应该将 password 限制在合理的长度(例如1024)。 salt 应当距离适当的源大约16个或更多个字节,例如。 os.urandom()

iterations 的数量应该基于散列算法和计算能力来选择。截至2013年,建议至少100,000次迭代的SHA-256。

dklen 是导出密钥的长度。如果 dklenNone,则使用散列算法 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 中定义的。

passwordsalt 必须是字节状对象。应用程序和库应该将 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哈希函数

参见

模块 hmac

使用哈希生成消息认证代码的模块。

模块 base64

另一种对非二进制环境的二进制散列进行编码的方法。

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