Python hashlib模块:哈希算法、编码处理与HMAC应用详解

季宁
季宁
发布时间:2026-10-12| 2人浏览过
原创

hashlib是Python标准库中用于安全哈希与消息摘要的核心模块,整合了MD5、SHA1至SHA512等多种算法。本文通过具体代码示例,解析字符串编码转换、哈希对象状态管理以及HMAC密钥认证协议在Python及其他语言中的实现方式。

hashlib模块基础与算法支持

hashlib模块提供了多种不可逆的哈希签名方法,包括MD5、SHA1、SHA224、SHA256、SHA384和SHA512。这些算法广泛应用于数据完整性校验与身份认证场景。使用hashlib时,核心原则是加密对象必须为二进制编码(bytes),直接传入Unicode字符串将导致类型错误。

常见哈希算法实现

以下代码展示了使用hashlib生成不同算法哈希值的完整流程。通过实例化对应的算法对象(如md5、sha1等),调用update方法传入编码后的字符串,最后通过hexdigest()获取十六进制摘要。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#pyversion:python3.5
#owner:fuzj

import hashlib
# ######## md5 ########
string = "beyongjie"
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))   #注意转码
res = md5.hexdigest()
print("md5加密结果:",res)
# ######## sha1 ########
sha1 = hashlib.sha1()
sha1.update(string.encode('utf-8'))
res = sha1.hexdigest()
print("sha1加密结果:",res)
# ######## sha256 ########
sha256 = hashlib.sha256()
sha256.update(string.encode('utf-8'))
res = sha256.hexdigest()
print("sha256加密结果:",res)
# ######## sha384 ########
sha384 = hashlib.sha384()
sha384.update(string.encode('utf-8'))
res = sha384.hexdigest()
print("sha384加密结果:",res)
# ######## sha512 ########
sha512= hashlib.sha512()
sha512.update(string.encode('utf-8'))
res = sha512.hexdigest()
print("sha512加密结果:",res)

执行上述代码后,将得到各算法对应的十六进制摘要结果:

md5加密结果: 0e725e477851ff4076f774dc312d4748
sha1加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha256加密结果: 1e62b55bfd02977943f885f6a0998af7cc9cfb95c8ac4a9f30ecccb7c05ec9f4
sha384加密结果: e91cdf0d2570de5c96ee84e8a12cddf16508685e7a03b3e811099cfcd54b7f52183e20197cff7c07f312157f0ba4875b
sha512加密结果: 3f0020a726e9c1cb5d22290c967f3dd1bcecb409a51a8088db520750c876aaec3f17a70d7981cd575ed4b89471f743f3f24a146a39d59f215ae3e208d0170073

字符串编码与错误处理

在Python 3中,hashlib要求输入数据必须是字节串。若直接传入字符串,会抛出TypeError。解决此问题主要有两种方法:使用字符串的encode()方法或bytes()构造函数。

编码转换示例

以下代码对比了直接传入字符串导致的错误,以及使用encode和bytes两种正确转换方式:

sha1 = hashlib.sha1()
sha1.update(string)
res = sha1.hexdigest()
print("sha1加密结果:",res)

TypeError: Unicode-objects must be encoded before hashing

正确的转换方式如下:

shaa1 = hashlib.sha1()
shaa1.update(string.encode('utf-8'))
res = shaa1.hexdigest()
print("sha1采用encode转换加密结果:",res)
shab1 = hashlib.sha1()
shab1.update(bytes(string,encoding='utf-8'))
res = shab1.hexdigest()
print("sha1采用byte转换的结果:",res)

两种方法生成的哈希结果一致:

sha1采用encode转换加密结果: 458d32be8ea38b66300174970ab0a8c0b734252f
sha1采用byte转换的结果: 458d32be8ea38b66300174970ab0a8c0b734252f

update方法特性与密钥加密

hashlib对象的update()方法支持多次调用,其效果等同于将所有参数拼接后一次性传入。此外,通过初始化时传入密钥(key),可以实现更安全的哈希计算,以抵御撞库攻击。

累积更新与密钥加密

以下代码演示了update的累积特性及添加自定义key的加密方式:

m = hashlib.md5()
m.update('a'.encode('utf-8'))
res = m.hexdigest()
print("第一次a加密:",res)
m.update('b'.encode('utf-8'))
res = m.hexdigest()
print("第二次b加密:",res)

m1 = hashlib.md5()
m1.update('b'.encode('utf-8'))
res = m1.hexdigest()
print("b单独加密:",res)
m2 = hashlib.md5()
m2.update('ab'.encode('utf-8'))
res = m2.hexdigest()
print("ab单独加密:",res)

输出结果验证了累积更新等效于拼接:

第一次a加密: 0cc175b9c0f1b6a831c399e269772661
第二次b加密: 187ef4436122d1cc2f40dc2b92f0eba0
b单独加密: 92eb5ffee6ae2fec3ad71c777531578f
ab单独加密: 187ef4436122d1cc2f40dc2b92f0eba0

通过初始化时指定key,可以生成不同的哈希值,增加安全性:

low = hashlib.md5()
low.update('ab'.encode('utf-8'))
res = low.hexdigest()
print("普通加密:",res)
high = hashlib.md5(b'beyondjie')
high.update('ab'.encode('utf-8'))
res = high.hexdigest()
print("采用key加密:",res)
输出结果:
普通加密: 187ef4436122d1cc2f40dc2b92f0eba0
采用key加密: 1b073f6b8cffe609751e4c98537b7653

HMAC协议与多语言实现

HMAC(基于密钥的Hash算法认证协议)利用公开Hash函数和私有密钥生成鉴别码,常用于接口Token验证。以下展示了Python、PHP、C++及Shell中HMAC-SHA1的实现方式。

Python实现

Python中可使用hmac模块结合hashlib和base64实现:

       import hmac
       import hashlib
       import base64
       hmac.new(Token,data,hashlib.sha1).digest().encode('base64').rstrip()

PHP实现

PHP中使用hash_hmac函数:

       base64_encode(hash_hmac("SHA1",clientStr,Token , true))

C++ (OpenSSL)实现

C++中通过OpenSSL库调用HMAC函数:

        HMAC( EVP_sha1(),
          /*key data*/ strKey.data(),
          /*key len*/ strKey.size(),
          /*data */(unsigned char*) strRandom.data(),
          /*data len*/ strRandom.size(), digest, &digest_len))

Shell实现

在Shell脚本中,可利用openssl命令结合base64编码:

       echo -n '3f88a95c532bea70' | openssl dgst -hmac '123' -sha1 -binary | base64

以上代码展示了不同语言环境下HMAC-SHA1的基本用法。请注意,涉及外部输入拼接的代码在生成生产环境Token时需严格验证输入合法性,防止注入风险。

以上就是Python中hashlib模块用法的详细内容,更多关于Python哈希加密与HMAC实现的技术资料请关注本站其它相关文章!

相关标签:

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

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 算法库。