Python 数据加密传输的强制要求

1次阅读

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

Python 数据加密传输的强制要求

Python 里 ssl 模块必须启用验证,否则加密形同虚设

不校验证书的 HTTPS 请求,等于把密文发给中间人——对方能解密、篡改、重放。Python 默认不强制验证(尤其旧版本或手动构建 urllib.request.urlopen 时),这是最常被忽略的安全缺口。

  • requests 库时,verify=True 是默认值,但若显式设为 False 或传入自签名证书路径出错,就直接失效
  • urllib 时,默认根本不校验;必须手动传入 context=ssl.create_default_context()
  • 自建 SSLContext 时,漏掉 context.check_hostname = Truecontext.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-GCMciphertexttag 是原始 bytes,需自行编码(如 base64)再传输

requests.post 发送加密数据时,别把密文当 JSON 字段直接塞

很多人把加密后的 bytes 直接赋给 JSON 字典字段,结果触发 TypeError: Object of type bytes is not JSON serializable——这不是加密错了,是序列化方式错了。

  • 加密后得到的是 bytes,JSON 只认 str;必须先用 base64.b64encode(ciphertext).decode() 转成字符串
  • 服务端接收后,要反向:先 base64.b64decode(),再解密;顺序错一步,整个 payload 就无效
  • 如果走表单提交(data=...),也要注意:bytes 会自动转 str 再 urlencode,可能破坏二进制结构;此时应改用 files=... 或手动构造 body

密钥管理不是“存个变量”,os.environ.env 文件都不算安全存储

开发时把密钥写进环境变量或 .env,上线就容易被进程列表、日志、调试接口泄露。真正强制要求下,必须用外部密钥服务或操作系统级凭据管理。

立即学习Python免费学习笔记(深入)”;

  • os.environlinux 下对同用户其他进程可见;docker 容器里还可能被 docker inspect 暴露
  • python-decoupledotenv 加载的 .env 文件,若没加 .gitignore 或权限控制(chmod 600),等于公开密钥
  • 生产环境应优先对接 AWS KMSHashiCorp Vault 或系统 keyringwindows Credential Manager / macos Keychain),用时拉取,不用不驻留

加密传输真正的复杂点不在算法本身,而在密钥生命周期和 TLS 验证链的每个环节——少设一个 check_hostname,或把 base64 解错一位,整条链就断了。

text=ZqhQzanResources