一、前言
在Python后端开发、接口鉴权、密码存储、数据传输场景中,我们经常会用到各种“加密”方式。
但90%的新手都分不清:哪些是编码、哪些是哈希、哪些是真正的加密。
本文一次性讲透 Python 五大常用数据处理方式:
Base64(编码,可逆,非加密)
MD5(哈希摘要,不可逆,已不安全)
SHA256(哈希摘要,不可逆,密码/文件校验常用)
HMAC-SHA256(带密钥哈希,接口签名首选)
AES(真正对称加密,可逆、高安全)
全文代码可直接复制运行,看完彻底告别加密混淆!
二、核心概念先行(必看!避坑关键)
先搞懂三个核心分类,终身受用:
- 编码(Base64)
只是格式转换,完全可逆,无任何安全性,不是加密。 - 哈希摘要(MD5/SHA256)
单向不可逆,用来做指纹、校验、存密码,无法解密原文。 - 对称加密(AES)
真正的加密!可逆、需要密钥,密钥正确才能解密原文。
三、Base64 编码(最容易被误认为加密)
特点
✅ 可逆、可解码
✅ 用于二进制转文本传输(图片、文件、字节流)
❌ 绝对不能用于密码加密
Python 完整代码
importbase64 text="Python加密测试123"# 编码b64_str=base64.b64encode(text.encode("utf-8")).decode("utf-8")print("Base64编码结果:",b64_str)# 解码(完全还原原文)raw_str=base64.b64decode(b64_str).decode("utf-8")print("Base64解码结果:",raw_str)适用场景
图片转字符串、文件传输、接口二进制数据传递、前端展示字节内容。
四、MD5 哈希摘要(老旧、不推荐安全使用)
特点
不可逆、固定128位长度
已被破解,存在碰撞漏洞
只适合文件完整性校验,禁止存储密码
Python 代码
importhashlib text="123456"md5_res=hashlib.md5(text.encode("utf-8")).hexdigest()print("MD5结果:",md5_res)五、SHA256 哈希摘要(目前主流摘要算法)
特点
不可逆、固定64位16进制字符串
雪崩效应:改一个字,哈希完全大变
抗碰撞能力强,安全级别远高于MD5
Python 代码
importhashlib text="MyPassword123456"sha256_res=hashlib.sha256(text.encode("utf-8")).hexdigest()print("SHA256结果:",sha256_res)生产小坑
单纯SHA256存密码不安全,容易彩虹表爆破!生产必须加盐(salt):
importhashlib pwd="123456"salt="abcdef123456"# 自定义盐值# 加盐哈希safe_pwd=hashlib.sha256((pwd+salt).encode()).hexdigest()print("加盐SHA256密码:",safe_pwd)六、HMAC-SHA256(接口签名必备)
普通SHA256没有密钥,内容一样哈希就一样。
HMAC 带密钥哈希:相同内容,密钥不同,结果完全不同,是目前 API签名、验签、防篡改 标准方案。
Python 代码
importhmacimporthashlib# 密钥 + 请求内容secret=b"my_api_secret_key_666"content=b"user_id=1001&time=20260905"# 生成签名sign=hmac.new(secret,content,hashlib.sha256).hexdigest()print("HMAC-SHA256签名:",sign)适用:微信支付、第三方API、OpenAI接口、后端接口防篡改。
七、AES 对称加密(真正的加密算法)
前面所有算法:要么可逆无安全,要么不可逆不能解密。
AES是真正加密:加密后可解密,必须密钥!
适用于:手机号、身份证、用户隐私数据存储。
Python AES 极简可运行示例
需安装:pip install pycryptodome
fromCrypto.CipherimportAESimportbase64# 密钥必须16/24/32位key=b"1234567890123456"defaes_encrypt(text):cipher=AES.new(key,AES.MODE_ECB)# 补位pad=16-len(text.encode())%16text+=chr(pad)*pad res=cipher.encrypt(text.encode())returnbase64.b64encode(res).decode()defaes_decrypt(cipher_text):cipher=AES.new(key,AES.MODE_ECB)res=cipher.decrypt(base64.b64decode(cipher_text))pad=res[-1]returnres[:-pad].decode()if__name__=="__main__":s="私密数据:13800138000"enc=aes_encrypt(s)dec=aes_decrypt(enc)print("AES加密:",enc)print("AES解密:",dec)八、五大算法终极对比(面试必背)
算法 类型 可逆 是否需要密钥 核心用途
Base64 编码 ✅ 可逆 否 二进制转文本传输
MD5 哈希摘要 ❌ 不可逆 否 文件校验(淘汰)
SHA256 哈希摘要 ❌ 不可逆 否 密码摘要、数据指纹
HMAC-SHA256 密钥哈希 ❌ 不可逆 ✅ 需要 接口签名、防篡改
AES 对称加密 ✅ 可逆 ✅ 需要 隐私数据加密存储
九、业务场景最佳选型(工作直接照抄)
图片、文件、二进制传输 → Base64
用户密码存储 → 加盐SHA256 / bcrypt(拒绝MD5)
接口请求签名、防篡改 → HMAC-SHA256
手机号、身份证需要解密读取 → AES对称加密
文件完整性校验 → SHA256
十、总结
- Base64只是转码,毫无保密性,千万别当加密用。
- MD5彻底过时,新项目一律不用。
- SHA256适合做数据指纹,存密码必须加盐。
- HMAC-SHA256是目前最通用的接口安全签名方案。
- 真正需要加密解密的隐私数据,必须上 AES。
看懂这篇,彻底解决 Python 加密领域 90% 的开发、面试、业务问题!