Python3学习之路~5.12 hashlib & hmac & md5 & sha & base64模块
hashlib模块用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

import md5 hash = md5.new() hash.update('Hello') print hash.hexdigest()

import sha hash = sha.new() hash.update('Hello') print hash.hexdigest()

import hashlib # ######## md5 ######### hash = hashlib.md5() hash.update(b"Hello") hash.update(b"It's me") print(hash.digest()) # b']\xde\xb4{/\x92Z\xd0\xbf$\x9cR\xe3Br\x8a' 二进制数据字符串 print(hash.hexdigest()) # 5ddeb47b2f925ad0bf249c52e342728a 16进制格式hash,明文为“HelloIt's me” print(len(hash.hexdigest())) #32 hash2 = hashlib.md5() hash2.update('你好'.encode(encoding='utf-8')) print(hash2.hexdigest()) # 7eca689f0d3389d9dea66ae112e5cfd7 # ######## sha1 ######### hash =hashlib.sha1() hash.update(b'Hello') print(hash.hexdigest()) # f7ff9e8b7bb2e09b70935a5d785e0cc5d9d0abf0 # ######## sha256 ######## hash = hashlib.sha256() hash.update(b'Hello') print(hash.hexdigest()) # ######## sha384 ######## hash = hashlib.sha384() hash.update(b'Hello') print(hash.hexdigest()) # ######## sha512 ######## hash = hashlib.sha512() hash.update(b'Hello') print(hash.hexdigest())
以上加密算法虽然依然非常厉害,但存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
import hashlib hash = hashlib.md5(b'898oaFs09f') # key即898oaFs09f hash.update(b'Hello') # 明文为Hello print(hash.hexdigest())
还不够吊?python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 再进行处理然后再加密
散列消息鉴别码,简称HMAC,是一种基于消息鉴别码MAC(Message Authentication Code)的鉴别机制。
使用HMAC时,消息通讯的双方,通过验证消息中加入的鉴别密钥K来鉴别消息的真伪;
一般用于网络通信中消息加密,前提是双方先要约定好key,就像接头暗号一样,然后消息发送把用key把消息加密,接收方用key + 消息明文再加密,拿加密后的值 跟 发送者的相对比是否相等,这样就能验证消息的真实性,及发送者的合法性了。

import hmac h = hmac.new(b'mykey',msg=b'Hello world') print(h.hexdigest()) # 807f6a8c01dcf0d82eda2dd704291c78 h = hmac.new(b'mykey',msg='你好'.encode(encoding='UTF-8')) print(h.hexdigest()) # 0fc9eba32da88e49cefa687b7e6d6927 h = hmac.new(b"mykey") # key = 'mykey' h.update(b'Hello world') # msg='Hello world') print(h.hexdigest()) # 807f6a8c01dcf0d82eda2dd704291c78
更多关于md5,sha1,sha256等介绍的文章看这里https://www.tbs-certificates.co.uk/FAQ/en/sha256.html
补充:base64模块
很多互联网请求的消息头传送字段值时都会对其进行加密。一般是先计算MD5加密的32位字符串(或者二进制数组(128位)),然后再对其进行base64编码,以Python3为例,代码如下:
import hashlib,base64 a =hashlib.md5() a.update("0123456789".encode()) print("MD5加密后的32位字符串:",a.hexdigest()) print("base64编码1",base64.b64encode(a.hexdigest().encode())) print("MD5加密后的二进制数组(128位):",a.digest()) print("base64编码2",base64.b64encode(a.digest()))
输出如下:
MD5加密后的32位字符串: 781e5e245d69b566979b86e28d23f2c7
base64编码1 b'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='
MD5加密后的二进制数组(128位): b'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'
base64编码2 b'eB5eJF1ptWaXm4bijSPyxw=='
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通