推荐五种安全存储敏感配置的方式:一、cryptography库fernet对称加密;二、环境变量+aes-gcm运行时解密;三、hashicorp vault动态获取;四、操作系统密钥环(keyring);五、配置文件aes加密+启动内存解密。

如果您的 Python 应用中包含数据库密码、API 密钥等敏感配置信息,直接以明文形式写入配置文件或环境变量存在严重安全风险。以下是几种可实际部署的加密存储方式:
一、使用 cryptography 库进行对称加密
该方法利用 Fernet 对称加密算法,要求密钥严格保密,适用于单机或受控环境中配置项的加解密。密钥需通过安全渠道分发,不可硬编码在源码中。
1、安装依赖:pip install cryptography
2、生成密钥并安全保存:from cryptography.fernet import Fernet; key = Fernet.generate_key(); print(key.decode())
立即学习“Python免费学习笔记(深入)”;
3、加密配置值:f = Fernet(key); encrypted = f.encrypt(b"my_secret_password"); print(encrypted.hex())
4、在应用启动时读取密钥与密文,调用 f.decrypt(bytes.fromhex(encrypted_hex)) 还原为原始字节串
二、基于环境变量 + AES-GCM 的运行时解密
将密钥与密文分别存于不同可信通道:密钥通过操作系统级环境变量注入,密文嵌入配置文件。AES-GCM 提供认证加密,可检测篡改。
1、使用 os.environ.get("CONFIG_KEY") 获取十六进制格式密钥字符串
2、将密钥转换为 32 字节 bytes:key_bytes = bytes.fromhex(os.environ["CONFIG_KEY"])
3、从 YAML/JSON 配置中读取 base64 编码的 ciphertext 和 nonce 字段
4、构造 AESGCM 实例:from cryptography.hazmat.primitives.ciphers.aead import AESGCM; aesgcm = AESGCM(key_bytes)
5、执行解密:plaintext = aesgcm.decrypt(nonce, ciphertext, associated_data=None)
三、使用 HashiCorp Vault 动态获取配置
Vault 提供集中式密钥管理与租约机制,Python 应用通过 API 在运行时按需拉取解密后的配置值,避免本地持久化密钥或密文。
1、部署 Vault 服务并启用 kv-v2 secrets 引擎
2、写入密钥:vault kv put secret/app/db password=prod_db_pass_2024
3、为应用分配 token 或使用 AppRole 认证:vault token create -policy=app-policy
4、Python 中使用 hvac 库:import hvac; client = hvac.Client(url="https://vault.example.com", token=os.environ["VAULT_TOKEN"])
5、读取值:response = client.secrets.kv.v2.read_secret_version(path="app/db"); password = response["data"]["data"]["password"]
四、利用操作系统密钥环(Keyring)存储
借助系统级凭据管理器(如 Windows Credential Manager、macOS Keychain、Linux Secret Service),将配置值作为凭据条目保存,由 OS 负责加密保护。
1、安装包:pip install keyring
2、写入凭据:import keyring; keyring.set_password("myapp", "db_password", "s3cr3t!")
3、读取时无需提供密钥:pwd = keyring.get_password("myapp", "db_password")
4、确保目标平台已安装对应后端:例如 Linux 需启用 org.freedesktop.secrets 服务并安装 secret-tool
五、配置文件 AES 加密 + 启动时内存解密
将整个配置文件(如 config.yaml.enc)使用预共享密钥 AES-CBC 加密,应用启动时读取密钥、解密后加载至内存,全程不落盘明文配置。
1、加密配置文件:使用 openssl aes-256-cbc -salt -in config.yaml -out config.yaml.enc -k shared_key_phrase
2、Python 启动脚本中导入 cryptography.hazmat.primitives.ciphers
3、从安全位置读取共享密钥短语(如硬件安全模块 HSM 输出或受控环境变量)
4、构造 Cipher 对象,使用相同 salt 和 IV 解密 config.yaml.enc 内容
5、将解密结果解析为 dict 并绑定到 app.config 或 settings 对象,后续不再访问加密文件









