Python3 hashlib模块MD5加密详解与中文编码处理

小林子
小林子
发布时间:2026-10-13| 6人浏览过
原创

本文详解Python3中hashlib库的MD5加密用法。针对Python3标准库变化,介绍md5()及SHA系列算法创建哈希对象的方法。重点解析中文加密时的UTF-8、GBK等编码转换,以及hash.update()拼接数据的特性,提供完整代码示例与算法列表查询方式。

在Python3的标准库中,MD5算法已不再直接作为独立模块存在,而是统一归入hashlib标准库。该库涵盖了SHA1、SHA224、SHA256、SHA384、SHA512以及MD5等多种哈希加密算法。

网络上关于Python MD5加密的教程往往存在版本过时或表述不清的问题。为确保准确性,建议直接查阅官方文档,并在此整理MD5的具体使用方法。

学习编程知识时,阅读官方文档是最有效的途径之一。尽管文档多为英文,可能存在一定门槛,但习惯阅读英文技术文档是开发者的重要能力。

建议直接阅读Python3的hashlib官方文档:

https://docs.python.org/3/library/hashlib.html?highlight=hashlib#credits

hashlib库提供了多种哈希算法,包括sha1()、sha224()、sha256()、sha384()、sha512()、blake2b()、blake2s()以及md5()。这些方法通过统一接口返回一个哈希对象,例如使用sha256()可创建SHA-256哈希对象。

进行MD5加密时,需调用md5()方法:

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'

# 或者可以这样
>>> hashlib.md5(b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

# 也可以使用hash.new()这个一般方法
>>> hashlib.new('md5', b'123').hexdigest()
'202cb962ac59075b964b07152d234b70'

上述示例针对英文文本进行MD5加密。若对中文进行加密,直接套用上述代码会报错,原因在于字符编码转换问题,需按以下方式处理:

>>> import hashlib
>>> data = '你好'
>>> hashlib.md5(data.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

此处先将数据转换为UTF-8格式。使用在线工具对比加密结果发现,部分MD5加密工具并非默认使用UTF-8格式进行加密。

经测试,目前支持转换为UTF-8、GBK、GB2312、GB18030编码。由于GBK、GB2312和GB18030均针对汉字编码,因此使用这些编码进行MD5加密的结果一致,且编码名称不区分大小写。

除上述编码格式外,可能还存在其他编码方式,目前尚未发现,欢迎补充。

参考以下实例:

>>> hashlib.md5('你好'.encode(encoding='UTF-8')).hexdigest()
'7eca689f0d3389d9dea66ae112e5cfd7'

>>> hashlib.md5('你好'.encode(encoding='GBK')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB2312')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

>>> hashlib.md5('你好'.encode(encoding='GB18030')).hexdigest()
'b94ae3c6d892b29cf48d9bea819b27b9'

若仅需查询MD5的写法,查看上述实例即可;

若是Python新手,希望了解这些方法的具体含义和用法,请继续阅读以下内容。

解析

1. hashlib.new(name[, data])方法

这是一个通用方法。

name参数传入哈希加密算法的名称,例如md5;

data参数传入需要加密的数据,该参数可忽略,后续可在update()方法中传入。

>>> m = hashlib.new('md5')
>>> m.update(b'123456')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'

可以使用hashlib.algorithms_guaranteed或hashlib.algorithms_available这两个内置属性来查看hashlib支持哪些加密算法。

hashlib.algorithms_guaranteed是一个集合,包含所有平台上保证被hashlib模块支持的哈希算法名称;

hashlib.algorithms_available是一个集合,包含当前运行的Python编译器可用的哈希算法名称。由于OpenSSL的原因,其中可能出现重复的哈希算法名称。

hashlib.algorithms_guaranteed是hashlib.algorithms_available的子集。

参考以下输出:

>>> hashlib.algorithms_guaranteed
{'sha3_384', 'md5', 'blake2s', 'sha3_512', 'blake2b', 'shake_128', 'sha384', 'sha3_256', 'sha1', 'shake_256', 'sha3_224', 'sha512', 'sha256', 'sha224'}
>>> hashlib.algorithms_available
{'whirlpool', 'ripemd160', 'dsaEncryption', 'sha1', 'SHA224', 'sha512', 'sha256', 'SHA512', 'blake2s', 'blake2b', 'SHA256', 'sha384', 'sha3_256', 'SHA384', 'sha', 'sha224', 'RIPEMD160', 'shake_128', 'sha3_512', 'SHA', 'MD5', 'shake_256', 'DSA', 'sha3_384', 'DSA-SHA', 'ecdsa-with-SHA1', 'md5', 'SHA1', 'dsaWithSHA', 'md4', 'MD4', 'sha3_224'}

2. hash.update(arg)

传入arg对象来更新哈希对象。必须注意的是,该方法只接受byte类型,否则会报错。这就是要在参数前添加b来转换类型的原因:

>>> m = hashlib.md5()
>>> m.update('123456')
TypeError: Unicode-objects must be encoded before hashing

同时要注意,重复调用update(arg)方法,是将传入的arg参数进行拼接,而不是覆盖。必须注意这一点,因为在不熟悉update()原理时,很容易因此出错。

也就是说,m.update(a); m.update(b) 等价于m.update(a+b),参考以下例子:

>>> m = hashlib.md5()
>>> m.update(b'123')
>>> m.hexdigest()
'202cb962ac59075b964b07152d234b70'
>>> m.update(b'456')
>>> m.hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

>>> hashlib.md5(b'123456').hexdigest()
'e10adc3949ba59abbe56e057f20f883e'

3. hash.hexdigest()

众所周知,在英语中hex代表十六进制,因此该方法是将hash中的数据转换为十六进制字符串,其中仅包含十六进制数字。另外还有hash.digest()方法。

以上这篇Python3中的MD5加密实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。