PHP 数据脱敏与加密的区别与实践

```html PHP 数据脱敏与加密的区别与实践

PHP 数据脱敏与加密的区别与实践

在 Web 开发中,保护用户隐私是开发者的基本责任。PHP 中常涉及两类敏感数据处理技术:**数据脱敏(Masking)** 和 **数据加密(Encryption)**。二者目标相似,但原理、场景与实现截然不同。

核心区别

  • 脱敏:不可逆的“遮盖”,仅用于展示或日志,不保留原始值(如:138****1234);
  • 加密:可逆的“转化”,用于安全存储与传输,支持解密还原(如 AES-256-GCM)。

实践示例

✅ 数据脱敏(展示层防护)

适用于前端显示、日志记录等无需还原的场景:

<?php
function maskPhone(string $phone): string
{
    return preg_replace('/^(\d{3})\d{4}(\d{4})$/', '$1****$2', $phone);
}

function maskEmail(string $email): string
{
    [$local, $domain] = explode('@', $email);
    $maskedLocal = substr($local, 0, 1) . str_repeat('*', strlen($local) - 2) . substr($local, -1);
    return $maskedLocal . '@' . $domain;
}

echo maskPhone('13812345678');   // 输出:138****5678
echo maskEmail('user@example.com'); // 输出:u****r@example.com ?>

✅ 数据加密(存储层防护)

使用 PHP 内置 openssl_encrypt 实现 AES-256 加密(需密钥管理):

<?php
class SecureCrypto
{
    private const METHOD = 'AES-256-GCM';
    private const KEY_LENGTH = 32;
    
    public static function encrypt(string $data, string $key): string
    {
        $iv = random_bytes(openssl_cipher_iv_length(self::METHOD));
        $tag = '';
        $encrypted = openssl_encrypt(
            $data, self::METHOD, $key, OPENSSL_RAW_DATA, $iv, $tag
        );
        return base64_encode($iv . $tag . $encrypted);
    }
    
    public static function decrypt(string $data, string $key): ?string
    {
        $decoded = base64_decode($data);
        $ivLen = openssl_cipher_iv_length(self::METHOD);
        $iv = substr($decoded, 0, $ivLen);
        $tag = substr($decoded, $ivLen, 16);
        $ciphertext = substr($decoded, $ivLen + 16);
        
        return openssl_decrypt(
            $ciphertext, self::METHOD, $key, OPENSSL_RAW_DATA, $iv, $tag
        );
    }
}

$key = hash('sha256', 'your-app-secret-key', true); // 生产环境请使用安全密钥管理服务
$encrypted = SecureCrypto::encrypt('张三的身份证号:11010119900307235X', $key);
echo "密文:" . substr($encrypted, 0, 40) . "...\n";
echo "解密:" . SecureCrypto::decrypt($encrypted, $key); // 还原原文
?>
⚠️ 注意:脱敏不等于安全 —— 日志中若含未脱敏字段仍可能泄露;加密不等于万能 —— 密钥泄露即全盘崩溃。建议:脱敏用于输出,加密用于存储,并配合 HTTPS、最小权限原则与定期审计。

总结:脱敏是“看得见但看不懂”,加密是“看不懂但可还原”。合理组合二者,才能构建纵深防御的数据安全体系。

```