Python 中的 MD5 哈希

TJ Lerias 2023年1月30日 Python Python MD5
  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 对象,该方法返回仅包含十六进制数字的摘要的字符串对象。

Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe