python ssl必须启用证书验证,否则https加密形同虚设;fernet适合简单场景,aes-gcm需严管nonce;密文须base64编码后再json序列化;密钥应交由kms等安全服务管理。

Python 里 ssl 模块必须启用验证,否则加密形同虚设
不校验证书的 HTTPS 请求,等于把密文发给中间人——对方能解密、篡改、重放。Python 默认不强制验证(尤其旧版本或手动构建 urllib.request.urlopen 时),这是最常被忽略的安全缺口。
- 用
requests库时,verify=True是默认值,但若显式设为False或传入自签名证书路径出错,就直接失效 - 用
urllib时,默认根本不校验;必须手动传入context=ssl.create_default_context() - 自建
SSLContext时,漏掉context.check_hostname = True或context.verify_mode = ssl.CERT_REQUIRED,验证即不完整
对称加密选 fernet 还是 AES-GCM?看是否需要认证加密
fernet(来自 cryptography 库)封装了 AES-128-CBC + HMAC,简单安全;但如果你要更低延迟、更高吞吐,或需与非 Python 系统互通,就得直用 AES-GCM。
-
fernet要求密钥必须由Fernet.generate_key()生成,不能手拼;用错格式会抛InvalidToken -
AES-GCM必须严格保管nonce(一次一 nonce),重复使用会导致密文可被破解;nonce不用保密,但绝不能复用 - 传输时,
fernet输出是 base64 编码字节串;AES-GCM的ciphertext和tag是原始 bytes,需自行编码(如 base64)再传输
requests.post 发送加密数据时,别把密文当 JSON 字段直接塞
很多人把加密后的 bytes 直接赋给 JSON 字典字段,结果触发 TypeError: Object of type bytes is not JSON serializable——这不是加密错了,是序列化方式错了。
ShopNC单用户商城系统是面向独立卖家而开发的B2C商城系统。系统运行稳定高效,功能强大,突出个性化配置要求,可以根据不同的营销策略,从模板、栏目、功能上进行调整,满足各类客户的需要。系统部署快捷方便,减轻了使用者的技术负担,简单的维护操作免去了用户的后顾之忧。本系统前台开放源码,后台加密的。产品特点快速安装,维护简单 分布提示安装,即使不熟悉技术的用户也可以自主安装系统。后台融合数据库等功能管
- 加密后得到的是
bytes,JSON 只认str;必须先用base64.b64encode(ciphertext).decode()转成字符串 - 服务端接收后,要反向:先
base64.b64decode(),再解密;顺序错一步,整个 payload 就无效 - 如果走表单提交(
data=...),也要注意:bytes会自动转str再 urlencode,可能破坏二进制结构;此时应改用files=...或手动构造 body
密钥管理不是“存个变量”,os.environ 和 .env 文件都不算安全存储
开发时把密钥写进环境变量或 .env,上线就容易被进程列表、日志、调试接口泄露。真正强制要求下,必须用外部密钥服务或操作系统级凭据管理。
立即学习“Python免费学习笔记(深入)”;
-
os.environ在 Linux 下对同用户其他进程可见;Docker 容器里还可能被docker inspect暴露 -
python-decouple或dotenv加载的.env文件,若没加.gitignore或权限控制(chmod 600),等于公开密钥 - 生产环境应优先对接
AWS KMS、HashiCorp Vault或系统keyring(Windows Credential Manager / macOS Keychain),用时拉取,不用不驻留
加密传输真正的复杂点不在算法本身,而在密钥生命周期和 TLS 验证链的每个环节——少设一个 check_hostname,或把 base64 解错一位,整条链就断了。









