PHP 配置文件敏感信息加密保护实践
在 PHP 应用开发中,数据库密码、API 密钥、JWT 秘钥等敏感信息常存于 .env 或 config.php 文件中。若配置文件意外泄露(如 Git 提交、Web 目录误暴露),将导致严重安全风险。本文介绍一种轻量、可靠且符合 PSR 标准的加密保护方案。
核心思路:运行时解密,源码零明文
不将明文密钥写入版本库,而是使用对称加密(AES-256-CBC)加密敏感字段,并将密文与加密密钥(ENCRYPTION_KEY)分离存储——密钥仅存在于服务器环境变量或安全密钥管理服务中。
示例:加密配置与解密加载
步骤 1:生成安全密钥(一次执行)
// generate-key.php
$key = random_bytes(32); // 256-bit key
echo "ENCRYPTION_KEY=" . bin2hex($key) . "\n";
// 输出示例:ENCRYPTION_KEY=8a3f...c21e(存入服务器环境变量)
步骤 2:加密敏感值(本地操作)
// encrypt-value.php
$encryptionKey = hex2bin(getenv('ENCRYPTION_KEY'));
$value = 'my-db-password-2024!';
$iv = random_bytes(16);
$ciphertext = openssl_encrypt($value, 'AES-256-CBC', $encryptionKey, 0, $iv);
$encrypted = base64_encode($iv . $ciphertext);
echo "DB_PASSWORD_ENCRYPTED={$encrypted}\n";
// 存入 .env:DB_PASSWORD_ENCRYPTED=xxxxxx...
步骤 3:运行时安全解密(生产环境)
<?php
// config/secure-config.php
function decrypt(string $encrypted, string $keyHex): ?string
{
$data = base64_decode($encrypted);
if (strlen($data) < 16) return null;
$iv = substr($data, 0, 16);
$ciphertext = substr($data, 16);
$key = hex2bin($keyHex);
return openssl_decrypt($ciphertext, 'AES-256-CBC', $key, 0, $iv);
}
$encryptionKey = $_ENV['ENCRYPTION_KEY'] ?? getenv('ENCRYPTION_KEY');
if (!$encryptionKey || strlen($encryptionKey) !== 64) {
throw new RuntimeException('Invalid or missing ENCRYPTION_KEY');
}
return [
'database' => [
'host' => $_ENV['DB_HOST'] ?? 'localhost',
'username' => $_ENV['DB_USER'] ?? 'app',
'password' => decrypt($_ENV['DB_PASSWORD_ENCRYPTED'] ?? '', $encryptionKey),
'name' => $_ENV['DB_NAME'] ?? 'app_db'
]
];
⚠️ 重要安全提示:
• 确保
ENCRYPTION_KEY 仅通过 $_ENV 或 getenv() 读取,绝不硬编码;
• 使用 phpdotenv 加载 .env 时,禁用 Dotenv::createUnsafeImmutable();
• 生产环境禁用 display_errors,避免密钥意外输出;
• 定期轮换加密密钥并重新加密所有敏感值。
通过该方案,配置文件在 Git 中仅含密文,攻击者即使获取代码也无法还原凭证。结合环境隔离与最小权限原则,可显著提升 PHP 应用配置层安全性。
安全无小事,加密非万能——但它是纵深防御中不可或缺的一环。
```