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 "密文:{$ciphertext}\n";
echo "解密:{$decrypted}\n";
?>
⚠️ 注意:密钥和 IV 必须妥善保管(切勿硬编码)。生产环境建议使用
openssl_cipher_iv_length('AES-256-CBC') 动态获取 IV 长度,并将 IV 与密文一同存储(IV 可公开,但必须唯一)。
✅ 非对称加密:RSA(用于签名/密钥交换)
常用于身份认证、API 请求验签等场景。
<?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 message";
openssl_public_encrypt($data, $encrypted, $publicKey);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo "RSA 加密成功:", base64_encode($encrypted), "\n";
echo "RSA 解密结果:{$decrypted}\n";
?>
✅ 实用技巧
- 验证支持算法:
print_r(openssl_get_cipher_methods()); - 错误处理:始终检查返回值:
if ($ciphertext === false) { throw new Exception(openssl_error_string()); } - 密码派生(密钥生成):用
hash_pbkdf2()将口令转为密钥:
$key = hash_pbkdf2('sha256', $password, $salt, 100000, 32, true);
🔐 安全无小事。始终优先使用 OpenSSL 而非自研加密逻辑,定期更新 PHP 版本以获得最新安全补丁。
本文基于 PHP 8.1+ 编写,兼容 Laravel、Symfony 等主流框架。
```