30.1 引言
在处理用户数据、认证信息、网络通信等场景时,安全问题至关重要。
本章将学习:
- 常见安全风险与防护
- 使用哈希保证数据完整性
- 使用对称加密和非对称加密
- 安全地存储密码
- Python 安全编程最佳实践
30.2 常见安全风险与防护
风险类型 | 描述 | 防护措施 |
代码注入 | 用户输入被直接执行 | 严格验证输入、使用安全库 |
数据泄露 | 敏感数据明文存储或日志泄露 | 使用加密存储、限制日志输出 |
弱密码/密码泄露 | 密码明文保存或算法过时 | 使用 bcrypt/scrypt 等强哈希 |
中间人攻击 (MITM) | 传输未加密,被第三方篡改或截获 | 使用 HTTPS / TLS 加密传输 |
30.3 哈希(Hash)与完整性校验
30.3.1 使用 hashlib
示例:
import hashlib
data = "hello world".encode()
# 生成 SHA256 哈希
h = hashlib.sha256(data).hexdigest()
print(h)
哈希特点:不可逆、固定长度、同输入必同输出。
30.3.2 文件完整性校验
with open("file.zip", "rb") as f:
file_hash = hashlib.sha256(f.read()).hexdigest()
print("文件哈希:", file_hash)
常用于检查下载文件是否被篡改。
30.4 对称加密(Symmetric Encryption)
30.4.1 使用 cryptography 库
pip install cryptography
示例:
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
token = cipher.encrypt(b"my secret data")
print("加密后:", token)
data = cipher.decrypt(token)
print("解密后:", data)
同一密钥用于加密和解密,适合本地数据加密。
30.5 非对称加密(Asymmetric Encryption)
30.5.1 公钥/私钥加密示例
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes
# 生成密钥对
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()
message = b"secret"
ciphertext = public_key.encrypt(
message,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)
)
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None)
)
print("解密结果:", plaintext)
公钥加密,私钥解密,常用于传输中的密钥交换或身份认证。
30.6 安全存储密码(不可逆哈希)
30.6.1 使用 bcrypt
pip install bcrypt
示例:
import bcrypt
password = b"mypassword"
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
print("哈希:", hashed)
# 校验密码
if bcrypt.checkpw(password, hashed):
print("密码正确")
切勿明文保存用户密码,使用 慢速哈希(bcrypt/scrypt/argon2)提高破解成本。
30.7 安全编程最佳实践
- 不信任任何用户输入,做严格验证与转义
- 不在日志中打印敏感信息(token、密码)
- 定期升级依赖库,修复安全漏洞
- 使用 HTTPS/TLS 保护传输数据
- 使用环境变量存放密钥(不要写进代码库)
- 使用 secrets 模块生成随机安全 Token
secrets 生成 token:
import secrets
token = secrets.token_hex(16)
print(token)
30.8 小结
技术/工具 | 用途 |
hashlib | 数据完整性校验、不可逆哈希 |
cryptography.fernet | 对称加密,保护本地数据 |
cryptography.rsa | 非对称加密,用于密钥交换和身份认证 |
bcrypt | 安全地存储和验证密码 |
secrets | 生成不可预测的随机密钥/Token |
掌握本章内容后,你将能安全地处理敏感数据,避免常见安全漏洞。