Python 中的 MD5 哈希
本文将演示如何使用 Python hashlib
模块使用 MD5 哈希。
什么是哈希
散列是一个函数,它获取可变长度的数据并将其转换为固定长度。从散列函数返回的值称为散列值、散列代码或摘要。散列值通常用于索引称为散列表的固定大小的表。
什么是 MD5
MD5 消息摘要算法是一种流行的哈希函数,可生成 128 位哈希值。最初设计为加密哈希函数,由于存在多个安全问题和漏洞,它现在通常用于验证数据完整性。
Python hashlib
模块
Python 标准库包含一个模块,该模块实现了许多不同的安全散列和消息摘要算法,称为 hashlib
。它还可能包括其他可用的算法,具体取决于 Python 在你的平台上使用的 OpenSSL 库。
要使用散列算法,请导入 hashlib
模块。
import hashlib
我们现在可以使用该模块支持的散列算法。要检查正在运行的 Python 解释器中可用的哈希算法,请使用常量属性 algorithms_available
。
import hashlib
print(hashlib.algorithms_available)
输出:
{'md5', 'blake2s', 'sha256', 'sha384', 'sha3_512', 'blake2b', 'md4', 'md5-sha1', 'sha512_224', 'sha224', 'sha3_224', 'ripemd160', 'sha3_256', 'shake_256', 'sm3', 'shake_128', 'sha3_384', 'sha1', 'sha512_256', 'whirlpool', 'sha512'}
上面的列表是 hashlib
中可用的算法,包括 OpenSSL 的可用算法
要检查此模块保证在所有平台上支持的哈希算法,请使用常量属性 algorithms_guaranteed
。
import hashlib
print(hashlib.algorithms_guaranteed)
输出:
{'sha3_256', 'sha256', 'sha3_224', 'sha224', 'blake2s', 'sha3_512', 'shake_128', 'sha512', 'sha3_384', 'shake_256', 'md5', 'blake2b', 'sha384', 'sha1'}
md5
在 algorithms_guaranteed
列表中,但一些 FIPS 兼容上游供应商提供了排除它的 Python 构建。在 Python 中使用 MD5 算法
要使用 md5 算法,我们将使用 md5()
构造函数并使用 update()
方法为散列对象提供类似字节的对象,或者将数据作为构造函数的参数传递。
要获取哈希值,请使用 digest()
方法,该方法返回馈送到哈希对象的数据的 bytes
对象摘要。
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')
print(md5_hash.digest())
输出:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
你也可以将数据作为参数传递给构造函数并获取哈希值
import hashlib
print(hashlib.md5(b'Hello World').digest())
输出:
b'\xb1\n\x8d\xb1d\xe0uA\x05\xb7\xa9\x9b\xe7.?\xe5'
与 digest()
方法类似,你也可以使用 hexdigest()
,它返回仅包含十六进制数字的摘要的字符串对象。
import hashlib
md5_hash = hashlib.md5()
md5_hash.update(b'Hello World')
print(md5_hash.hexdigest())
输出:
b10a8db164e0754105b7a99be72e3fe5
请注意,在传递给 update()
方法的字符串文字之前有一个 b
。它用于创建 bytes
类型而不是 str
类型的实例。由于散列函数只接受一个字节序列作为参数。不支持将字符串对象传递给 update()
方法。
你还可以多次调用 update()
方法,这相当于将所有参数连接在一起的单个调用。
import hashlib
first_hash = hashlib.md5()
first_hash.update(b'Hello World, Hello Python')
print(first_hash.hexdigest())
second_hash = hashlib.md5()
second_hash.update(b'Hello World,')
second_hash.update(b' Hello Python')
print(second_hash.hexdigest())
输出:
b0f2921c8c0e63898b0388777908893a
b0f2921c8c0e63898b0388777908893a
总之,我们可以通过 hashlib
模块使用 md5
哈希算法,该模块可以通过将数据作为 md5()
构造函数的参数传递或使用 update()
方法来提供数据。我们可以使用 digest()
方法获取哈希值,该方法返回 digest()
或 hexdigest()
方法的 bytes
对象,该方法返回仅包含十六进制数字的摘要的字符串对象。