php实现对称加密
PHP 实现对称加密的方法
对称加密使用相同的密钥进行加密和解密。PHP 提供了多种内置函数和扩展来实现对称加密,以下是几种常见的方法:
使用 OpenSSL 扩展
OpenSSL 是 PHP 中常用的加密扩展,支持 AES、DES 等对称加密算法。以下是一个使用 AES-256-CBC 加密的示例:

$plaintext = "This is a secret message";
$key = openssl_random_pseudo_bytes(32); // 256-bit key
$iv = openssl_random_pseudo_bytes(16); // 128-bit IV
// 加密
$ciphertext = openssl_encrypt(
$plaintext,
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
// 解密
$decrypted = openssl_decrypt(
$ciphertext,
'aes-256-cbc',
$key,
OPENSSL_RAW_DATA,
$iv
);
echo "Original: $plaintext\n";
echo "Decrypted: $decrypted\n";
使用 Sodium 扩展
Sodium 是一个现代加密库,PHP 7.2+ 内置支持。以下是使用 Sodium 进行加密的示例:

$plaintext = "This is a secret message";
$key = sodium_crypto_secretbox_keygen(); // 生成随机密钥
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES); // 生成随机 nonce
// 加密
$ciphertext = sodium_crypto_secretbox($plaintext, $nonce, $key);
// 解密
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo "Original: $plaintext\n";
echo "Decrypted: $decrypted\n";
使用 Libsodium 兼容函数(PHP <7.2)
对于 PHP 7.2 以下版本,可以使用 Libsodium 的兼容函数:
$plaintext = "This is a secret message";
$key = random_bytes(32); // 256-bit key
$nonce = random_bytes(24); // 24-byte nonce
// 加密
$ciphertext = \Sodium\crypto_secretbox($plaintext, $nonce, $key);
// 解密
$decrypted = \Sodium\crypto_secretbox_open($ciphertext, $nonce, $key);
echo "Original: $plaintext\n";
echo "Decrypted: $decrypted\n";
使用 Mcrypt 扩展(已弃用)
Mcrypt 是一个较旧的加密扩展,已在 PHP 7.1 中弃用。不建议在新项目中使用,但以下是示例:
$plaintext = "This is a secret message";
$key = "ThisIsASecretKey123"; // 密钥
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_RAND);
// 加密
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, MCRYPT_MODE_CBC, $iv);
// 解密
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $ciphertext, MCRYPT_MODE_CBC, $iv);
echo "Original: $plaintext\n";
echo "Decrypted: $decrypted\n";
注意事项
- 密钥管理:密钥必须安全存储,避免硬编码在代码中。
- IV/Nonce:每次加密应使用不同的 IV 或 Nonce,避免重复使用。
- 算法选择:推荐使用 AES-256 或 ChaCha20 等现代算法。
- 错误处理:加密和解密操作可能失败,应检查返回值。
最佳实践
对于新项目,推荐使用 OpenSSL 或 Sodium 扩展。Sodium 提供了更简单的 API 和更高的安全性。OpenSSL 支持更多算法,但需要更多配置。Mcrypt 已过时,应避免使用。






