PHP 配置文件敏感信息加密保护

```html PHP 配置文件敏感信息加密保护实践

PHP 配置文件敏感信息加密保护实践

在 PHP 应用开发中,数据库密码、API 密钥、JWT 秘钥等敏感信息常存于 .envconfig.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 仅通过 $_ENVgetenv() 读取,绝不硬编码; • 使用 phpdotenv 加载 .env 时,禁用 Dotenv::createUnsafeImmutable(); • 生产环境禁用 display_errors,避免密钥意外输出; • 定期轮换加密密钥并重新加密所有敏感值。

通过该方案,配置文件在 Git 中仅含密文,攻击者即使获取代码也无法还原凭证。结合环境隔离与最小权限原则,可显著提升 PHP 应用配置层安全性。

安全无小事,加密非万能——但它是纵深防御中不可或缺的一环。

```