Python加解密全攻略:从MD5到RSA,一文掌握数据安全核心技能!
目录
在数据泄露频发的时代,掌握加密技术是每个开发者的必备技能!
一、哈希算法:数据的安全指纹
1.1 MD5加密基础
from hashlib import md5
data = "敏感用户数据"
obj = md5(data.encode())
res = obj.hexdigest()
print(f"MD5哈希值: {res}") # 32位十六进制字符串
核心特性:
-
固定32位输出(无论输入大小)
-
不可逆性:无法从哈希值反推原始数据
-
相同输入必然产生相同输出
-
易受彩虹表攻击(需加盐增强安全性)
1.2 加盐哈希:防御彩虹表攻击
from hashlib import sha256
def salted_hash(data, salt=None):
if not salt:
# 生成16字节随机盐(推荐做法)
salt = os.urandom(16)
obj = sha256(salt)
obj.update(data.encode())
return obj.hexdigest(), salt
# 使用示例
hashed_value, salt = salted_hash("user_password_123")
print(f"SHA256加盐哈希: {hashed_value}")
print(f"使用盐值: {salt.hex()}")
| 算法 | 输出长度 | 安全性 | 推荐场景 |
|---|---|---|---|
| MD5 | 32位 | 低 | 已不推荐使用 |
| SHA1 | 40位 | 中 | 兼容旧系统 |
| SHA256 | 64位 | 高 | 密码存储、数据验证 |
| SHA512 | 128位 | 极高 | 金融级安全应用 |
二、编码技术:数据的安全传输
2.1 URL编码/解码
from urllib.parse import urlencode, unquote
params = {"search": "区块链技术", "page": 2}
encoded = urlencode(params)
print(f"URL编码: {encoded}") # search=%E5%8C%BA%E5%9D%97%E9%93%BE%E6%8A%80%E6%9C%AF&page=2
decoded = unquote(encoded)
print(f"URL解码: {decoded}") # search=区块链技术&page=2
2.2 Base64编码:二进制转文本
import base64
data = "包含二进制数据的文件内容"
encoded = base64.b64encode(data.encode()).decode()
print(f"Base64编码: {encoded}")
decoded = base64.b64decode(encoded).decode()
print(f"Base64解码: {decoded}")
编码 ≠ 加密:
-
URL/Base64只是数据表示形式的转换
-
任何人都可以轻松解码还原原始数据
-
不提供任何安全性,仅用于数据格式转换
三、对称加密:AES实战
3.1 加密过程详解
from Crypto.Cipher import AES
import base64
import os
def aes_encrypt(data, key=None, iv=None):
# 生成随机密钥和IV(推荐)
if not key: key = os.urandom(16) # AES-128
if not iv: iv = os.urandom(16)
# PKCS#7填充
data = data.encode()
pad_len = 16 - (len(data) % 16)
data += bytes([pad_len]) * pad_len
# 创建加密器
cipher = AES.new(key, AES.MODE_CBC, iv)
# 加密并Base64编码
encrypted = base64.b64encode(cipher.encrypt(data))
return encrypted.decode(), key, iv
# 使用示例
plaintext = "信用卡号:6214 8567 1234 5678"
ciphertext, key, iv = aes_encrypt(plaintext)
print(f"AES加密结果: {ciphertext}")
3.2 解密过程
def aes_decrypt(ciphertext, key, iv):
cipher = AES.new(key, AES.MODE_CBC, iv)
decrypted = cipher.decrypt(base64.b64decode(ciphertext))
# 移除PKCS#7填充
pad_len = decrypted[-1]
return decrypted[:-pad_len].decode()
# 使用示例
decrypted_text = aes_decrypt(ciphertext, key, iv)
print(f"解密结果: {decrypted_text}")
关键要点:
-
密钥管理:安全存储密钥至关重要
-
初始化向量(IV):每次加密应使用随机IV
-
填充方案:PKCS#7是标准填充方式
-
工作模式:CBC需要IV,CTR模式不需要填充
四、非对称加密:RSA深度解析
4.1 生成密钥对
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_OAEP
# 生成2048位RSA密钥
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()
# 保存密钥
with open("private.pem", "wb") as f:
f.write(private_key)
with open("public.pem", "wb") as f:
f.write(public_key)
4.2 加密与解密
def rsa_encrypt(data, public_key_path):
with open(public_key_path, "rb") as f:
public_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(public_key)
return base64.b64encode(cipher.encrypt(data.encode())).decode()
def rsa_decrypt(ciphertext, private_key_path):
with open(private_key_path, "rb") as f:
private_key = RSA.import_key(f.read())
cipher = PKCS1_OAEP.new(private_key)
return cipher.decrypt(base64.b64decode(ciphertext)).decode()
# 使用示例
message = "绝密商业计划书内容"
encrypted = rsa_encrypt(message, "public.pem")
print(f"RSA加密结果: {encrypted}")
decrypted = rsa_decrypt(encrypted, "private.pem")
print(f"RSA解密结果: {decrypted}")
五、加密技术对比与应用场景
| 特性 | 哈希算法 | 对称加密(AES) | 非对称加密(RSA) |
|---|---|---|---|
| 速度 | 极快 | 快 | 慢 |
| 密钥管理 | 不需要密钥 | 共享密钥 | 公钥/私钥对 |
| 安全性 | 单向不可逆 | 高 | 极高 |
| 适用场景 | 密码存储、数据校验 | 大数据量加密 | 密钥交换、数字签名 |
| 典型应用 | 用户密码存储 | HTTPS数据传输 | SSH登录、数字证书 |
六、安全最佳实践
-
密码存储原则:
-
永远使用加盐哈希(SHA256+随机盐)
-
禁止使用MD5/SHA1存储敏感数据
-
# 正确做法
import bcrypt
password = "user_password".encode()
salt = bcrypt.gensalt()
hashed = bcrypt.hashpw(password, salt)
-
HTTPS通信要点:
-
使用TLS 1.3协议
-
配置HSTS强制加密
-
定期更新服务器证书
-
-
密钥安全管理:
# 使用环境变量存储密钥
export AES_KEY="$(openssl rand -hex 16)"
# 硬件安全模块(HSM)管理密钥
-
加密选择指南:
-
传输大量数据:AES-256(对称加密)
-
安全密钥交换:RSA-2048或ECC(非对称加密)
-
数据完整性验证:HMAC-SHA256
-
七、实战:综合加密系统设计

流程说明:
-
客户端请求服务器公钥
-
服务器返回RSA公钥
-
客户端生成随机AES密钥
-
用RSA公钥加密AES密钥
-
发送加密后的AES密钥和AES加密的数据
-
服务器用RSA私钥解密获取AES密钥
-
服务器用AES密钥解密数据
八、总结:构建安全防线
-
数据存储:
-
密码:加盐哈希(bcrypt/scrypt)
-
敏感信息:AES-256加密存储
-
-
数据传输:
-
网站:强制HTTPS(TLS 1.3+)
-
API:JWT令牌+加密载荷
-
-
密钥管理:
-
开发环境:环境变量+加密配置文件
-
生产环境:HSM/KMS解决方案
-
-
安全审计:
-
定期扫描依赖库漏洞
-
使用OWASP ZAP进行渗透测试
-
监控异常登录行为
-
最后警示:加密不是万能的!必须配合访问控制、日志审计和安全编码实践才能构建全面防御体系
资源推荐:
技术栈:Python 3.10+ · PyCryptodome 3.18 · hashlib · urllib
更多推荐
所有评论(0)