Python 中的 MD5 哈希

TJ Lerias 2023年1月30日
  1. 什么是哈希
  2. 什么是 MD5
  3. Python hashlib 模块
  4. 在 Python 中使用 MD5 算法
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'}
注意
md5algorithms_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 对象,该方法返回仅包含十六进制数字的摘要的字符串对象。