PHP 配置文件敏感信息加密保护实践
在 PHP 应用开发中,数据库密码、API 密钥、JWT 秘钥等敏感信息常存于 .env 或 config.php 文件中。若配置文件意外泄露(如 Git 提交、Web 目录误暴露),将导致严重安全风险。本文介绍一种轻量、可靠且符合 PSR 标准的加密保护方案。
核心思路:运行时解密,静态存储加密
不将明文密钥写入配置文件,而是使用对称加密(如 openssl_encrypt())预先加密敏感字段,运行时通过环境变量或本地密钥文件动态解密——实现“配置即代码”与“密钥分离”的安全原则。
示例:加密数据库密码
步骤 1:生成并安全保管主密钥
// generate-key.php —— 仅执行一次,密钥存于服务器环境变量或独立文件
$key = random_bytes(32); // AES-256 key
echo base64_encode($key); // 输出:eGZk...(请妥善保存!)
步骤 2:加密敏感值
// encrypt-value.php
$masterKey = base64_decode(getenv('APP_ENCRYPTION_KEY') ?: file_get_contents('/etc/secrets/app.key'));
$value = 'my_db_password_123';
$iv = random_bytes(16);
$ciphertext = openssl_encrypt($value, 'AES-256-CBC', $masterKey, 0, $iv);
$encrypted = base64_encode($iv . $ciphertext);
echo "ENCRYPTED_DB_PASS={$encrypted}";
步骤 3:配置文件中存储加密值(.env)
DB_HOST=localhost
DB_NAME=myapp
DB_USER=admin
DB_PASS=IV+CIPHERTEXT_BASE64_HERE // 如:TmFtZUJhcmtz...(实际为 base64 编码的 IV+密文)
步骤 4:运行时解密(config.php)
<?php
function decrypt($encrypted, $key) {
$data = base64_decode($encrypted);
$iv = substr($data, 0, 16);
$ciphertext = substr($data, 16);
return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, 0, $iv);
}
// 安全读取主密钥(推荐:环境变量 + 服务器级保护)
$encryptionKey = $_SERVER['APP_ENCRYPTION_KEY'] ??
(file_exists('/etc/secrets/app.key') ? file_get_contents('/etc/secrets/app.key') : null);
if (!$encryptionKey) {
throw new RuntimeException('Encryption key not available');
}
return [
'db' => [
'host' => $_ENV['DB_HOST'] ?? 'localhost',
'name' => $_ENV['DB_NAME'] ?? 'myapp',
'user' => $_ENV['DB_USER'] ?? 'root',
'pass' => decrypt($_ENV['DB_PASS'], base64_decode($encryptionKey)),
],
];
⚠️ 安全提醒:
• 主密钥严禁硬编码或提交至版本库;建议通过 Docker secrets、Kubernetes Secret 或服务器环境变量注入;
• 确保
.env 文件被 Web 服务器(如 Nginx/Apache)禁止直接访问;
• 使用 openssl_get_cipher_methods() 验证 AES-256-CBC 可用性;
• 生产环境启用 OpenSSL 错误报告(openssl_error_string())便于调试。
通过此方案,配置文件本身不再包含任何明文敏感信息,即使被泄露也难以解密——真正实现“数据不动,密钥不露”。安全不是功能,而是贯穿生命周期的设计习惯。
```