PHP 加密服务生产环境部署方案

```html PHP 加密服务生产环境部署方案

PHP 加密服务生产环境部署方案

在金融、支付、用户凭证等敏感场景中,PHP 应用需安全、可审计、可扩展的加密能力。本文提供一套面向生产环境的轻量级加密服务部署实践,兼顾安全性、性能与可维护性。

核心原则

  • 密钥分离:主密钥(KEK)与数据密钥(DEK)分层管理,KEK 存于环境变量或密钥管理服务(如 AWS KMS / HashiCorp Vault)
  • 算法合规:优先使用 openssl_encrypt() + AES-256-GCM(认证加密,防篡改)
  • 密钥轮换支持:加密时嵌入版本号(如 v1: 前缀),便于平滑升级

示例:安全加密服务类

<?php
class SecureCryptoService
{
    private const KEY_VERSION = 'v1';
    private string $kek;

    public function __construct()
    {
        $this->kek = $_ENV['ENCRYPTION_KEK'] ?? throw new RuntimeException('Missing ENCRYPTION_KEK');
        if (strlen($this->kek) !== 32) {
            throw new RuntimeException('KEK must be exactly 32 bytes (AES-256)');
        }
    }

    public function encrypt(string $plaintext): string
    {
        $iv = random_bytes(12); // GCM recommended IV length: 12 bytes
        $tag = '';
        $cipherText = openssl_encrypt(
            $plaintext,
            'aes-256-gcm',
            $this->kek,
            OPENSSL_RAW_DATA,
            $iv,
            $tag,
            '',
            16 // auth tag length
        );

        if ($cipherText === false) {
            throw new RuntimeException('Encryption failed: ' . openssl_error_string());
        }

        return self::KEY_VERSION . ':' . base64_encode($iv . $tag . $cipherText);
    }

    public function decrypt(string $ciphertext): string
    {
        if (!str_starts_with($ciphertext, self::KEY_VERSION . ':')) {
            throw new InvalidArgumentException('Unsupported encryption version');
        }

        $data = base64_decode(substr($ciphertext, strlen(self::KEY_VERSION) + 1));
        if ($data === false) {
            throw new InvalidArgumentException('Invalid base64 encoding');
        }

        $iv = substr($data, 0, 12);
        $tag = substr($data, 12, 16);
        $cipherText = substr($data, 28);

        $plaintext = openssl_decrypt(
            $cipherText,
            'aes-256-gcm',
            $this->kek,
            OPENSSL_RAW_DATA,
            $iv,
            $tag
        );

        if ($plaintext === false) {
            throw new RuntimeException('Decryption failed: ' . openssl_error_string());
        }

        return $plaintext;
    }
}

// 使用示例(生产中建议通过 DI 容器注入)
$service = new SecureCryptoService();
$encrypted = $service->encrypt('user_token_abc123');
echo "Encrypted: {$encrypted}\n";
echo "Decrypted: " . $service->decrypt($encrypted) . "\n";
?>

生产部署关键项

⚠️ 重要提醒:切勿硬编码密钥!使用环境变量(Docker secrets / Kubernetes Secrets)或专用 KMS。定期轮换 KEK 并迁移旧数据。
  • 容器化部署:Docker 中通过 --env-filesecrets 注入 KEK,禁止写入镜像层
  • 监控告警:记录加密/解密失败次数(如 Prometheus + Grafana),异常激增立即告警
  • 日志脱敏:严禁记录明文、密文或密钥——仅记录操作类型、耗时、结果状态
安全不是功能,而是持续演进的过程。从 AES-GCM 起步,再逐步集成密钥生命周期管理与硬件安全模块(HSM),方能构建真正可信的加密基础设施。 ```