PHP OpenSSL 加密解密完整教程
OpenSSL 是 PHP 内置的工业级加密扩展,支持 AES、RSA 等主流算法,安全可靠且无需额外安装扩展(PHP 7.1+ 默认启用)。
✅ 对称加密:AES-256-CBC(推荐)
适用于数据加解密(如用户敏感信息存储),需密钥 + IV(初始化向量)。
<?php
// 生成安全密钥(32字节 = AES-256)
$key = openssl_random_pseudo_bytes(32);
$iv = openssl_random_pseudo_bytes(16); // AES-CBC IV 长度固定为 16
$data = "Hello, 世界!";
$ciphertext = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);
$decrypted = openssl_decrypt($ciphertext, 'AES-256-CBC', $key, 0, $iv);
echo "原文: {$data}\n";
echo "密文: " . base64_encode($ciphertext) . "\n";
echo "解密: {$decrypted}\n";
?>
⚠️ 注意:密钥和 IV 必须安全存储(如环境变量),切勿硬编码。IV 可随密文明文传输(每次加密需不同),但密钥必须严格保密。
✅ 非对称加密:RSA(用于签名/密钥交换)
适合身份验证、数字签名或加密小数据(如会话密钥)。
<?php
// 生成 RSA 密钥对(生产环境请用 openssl_pkey_new() 或命令行)
$config = ['digest_alg' => 'sha256', 'private_key_bits' => 2048];
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey);
$publicKey = openssl_pkey_get_details($res)['key'];
// 加密(公钥)→ 解密(私钥)
$data = "Secret token";
openssl_public_encrypt($data, $encrypted, $publicKey);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo "加密后: " . base64_encode($encrypted) . "\n";
echo "解密后: {$decrypted}\n";
?>
✅ 完整实践:安全加解密函数封装
封装可复用、带错误处理的安全函数:
<?php
function safeEncrypt(string $data, string $key): ?string {
$ivlen = openssl_cipher_iv_length($cipher = "AES-256-CBC");
$iv = openssl_random_pseudo_bytes($ivlen);
$ciphertext = openssl_encrypt($data, $cipher, $key, 0, $iv);
if ($ciphertext === false) return null;
return base64_encode($iv . $ciphertext);
}
function safeDecrypt(string $payload, string $key): ?string {
$decoded = base64_decode($payload);
$ivlen = openssl_cipher_iv_length($cipher = "AES-256-CBC");
$iv = substr($decoded, 0, $ivlen);
$ciphertext = substr($decoded, $ivlen);
return openssl_decrypt($ciphertext, $cipher, $key, 0, $iv);
}
// 使用示例
$key = hash('sha256', 'your-app-secret-salt', true); // 衍生密钥
$enc = safeEncrypt("user@email.com", $key);
$dec = safeDecrypt($enc, $key);
echo $dec; // user@email.com
?>
🔐 最佳实践总结:
• 优先使用 AES-256-CBC 或 AES-256-GCM(PHP 7.1+ 支持);
• 密钥用 hash('sha256', $password, true) 衍生,避免弱密钥;
• 始终检查 openssl_encrypt/decrypt 返回值是否为 false;
• 敏感操作前调用 openssl_error_string() 排查错误。
掌握 OpenSSL,让 PHP 应用从「能运行」迈向「真安全」。
```