环境变量不直接加解密,而是安全传递密钥供程序动态解密;密钥通过环境变量注入(如encrypt_key),配置文件存密文,启动时自动解密,支持多环境切换且避免密钥硬编码、iv复用、日志泄露等风险。

环境变量本身不直接“加解密”,而是作为安全载体,把密钥或密文与配置逻辑解耦。真正实现动态加解密的是程序在启动或运行时,读取环境变量中的密钥(或密文),再调用加密库完成运算。核心在于“密钥不落地、解密不显形”。
密钥通过环境变量注入,而非写死在代码里
这是最基础也最关键的一环。敏感配置(如数据库密码)在配置文件中存为密文(例如 ENC(xxx)),而解密所需的密钥则由环境变量提供:
-
Linux/macOS 启动时传入:
ENCRYPT_KEY=abc123-32byte-aes-key java -jar app.jar -
Docker 中安全传递:
docker run -e ENCRYPT_KEY=$KEY myapp(注意:$KEY 应从宿主机安全来源获取,不写进脚本) - Kubernetes Secret 挂载:将密钥存为 Secret,以环境变量方式注入容器,避免出现在 Pod YAML 明文里
配置文件中只存密文,启动时自动解密
程序加载配置前,先扫描所有配置源(如 application.yml、.env),识别出带标识的密文字段(如 enc(…) 或 {cipher}…),再用环境变量提供的密钥实时解密:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- Spring Boot + Jasypt:配置
jasypt.encryptor.password=${ENCRYPT_KEY},框架自动拦截并替换ENC(...)字段 - 自定义 EnvironmentPostProcessor:遍历 PropertySource,对匹配正则
^enc\((.*)\)$的值调用 AES 解密函数 - Python 项目:用
os.getenv("DB_PASSWORD_ENC")读密文,再用cryptography.hazmat.primitives.ciphers解密后赋值给连接对象
支持多环境切换,无需改代码
不同环境使用不同密钥,只需变更环境变量,加解密逻辑完全复用:
- 开发环境:设
ENCRYPT_KEY=dev-test-key-32-bytes... - 生产环境:由运维通过 Vault 注入真实密钥,应用无感知
- 测试环境:CI 流程中用临时密钥生成密文,跑完即销毁
避免常见陷阱
看似简单,实操中几个点极易出错:
-
密钥长度必须合规:AES-256 要求 32 字节密钥,用
hashlib.sha256(key.encode()).digest()补齐,别直接截断 - IV(初始化向量)不能复用:加密时生成随机 IV 并与密文拼接(如 base64(iv+cipher)),解密时拆分使用
-
日志不打密钥也不打明文密码:解密后立即用于创建 DataSource 等对象,禁止
log.info("password: {}", pwd) -
环境变量权限要收紧:Linux 下执行
chmod 600 /proc/$(pidof java)/environ(需 root),防止其他用户读取










