php 实现openssl加密
PHP 使用 OpenSSL 加密的方法
对称加密(AES)
对称加密使用相同的密钥进行加密和解密。AES 是常用的对称加密算法。
// 加密
function encryptAES($data, $key, $iv) {
$encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return base64_encode($encrypted);
}
// 解密
function decryptAES($encryptedData, $key, $iv) {
$decrypted = openssl_decrypt(base64_decode($encryptedData), 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
return $decrypted;
}
// 示例
$key = openssl_random_pseudo_bytes(32); // 256-bit key
$iv = openssl_random_pseudo_bytes(16); // 128-bit IV
$data = "Sensitive data";
$encrypted = encryptAES($data, $key, $iv);
$decrypted = decryptAES($encrypted, $key, $iv);
非对称加密(RSA)
非对称加密使用公钥加密、私钥解密,适用于安全传输场景。
// 生成密钥对
$config = array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$keyPair = openssl_pkey_new($config);
openssl_pkey_export($keyPair, $privateKey);
$publicKey = openssl_pkey_get_details($keyPair)["key"];
// 加密
function encryptRSA($data, $publicKey) {
openssl_public_encrypt($data, $encrypted, $publicKey);
return base64_encode($encrypted);
}
// 解密
function decryptRSA($encryptedData, $privateKey) {
openssl_private_decrypt(base64_decode($encryptedData), $decrypted, $privateKey);
return $decrypted;
}
// 示例
$data = "Confidential message";
$encrypted = encryptRSA($data, $publicKey);
$decrypted = decryptRSA($encrypted, $privateKey);
数字签名
用于验证数据完整性和来源真实性。
// 签名
function createSignature($data, $privateKey) {
openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA256);
return base64_encode($signature);
}
// 验证
function verifySignature($data, $signature, $publicKey) {
$signature = base64_decode($signature);
return openssl_verify($data, $signature, $publicKey, OPENSSL_ALGO_SHA256);
}
// 示例
$data = "Important contract";
$signature = createSignature($data, $privateKey);
$isValid = verifySignature($data, $signature, $publicKey);
注意事项
- 密钥管理:对称加密的密钥需安全存储,非对称加密的私钥必须严格保密
- IV 使用:CBC 模式需每次加密使用唯一 IV,且不需要保密
- 错误处理:检查 openssl 函数返回值,处理可能的失败情况
- 算法选择:优先使用 AES-256 和 RSA-2048 以上强度
性能建议
- 大数据量使用对称加密,RSA 仅用于加密密钥或小数据
- 考虑使用 OpenSSL 的 EVP 系列函数进行更灵活的操作
- 敏感操作建议结合 HMAC 进行完整性验证







