php实现扩展加密解密
PHP 实现扩展加密解密的方法
使用 OpenSSL 扩展
OpenSSL 是 PHP 中常用的加密扩展,支持 AES、DES、RSA 等多种加密算法。以下是一个 AES-256-CBC 加密解密的示例:
$key = openssl_random_pseudo_bytes(32); // 256-bit key
$iv = openssl_random_pseudo_bytes(16); // 128-bit IV
$data = "Sensitive data";
// 加密
$encrypted = openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv);
// 解密
$decrypted = openssl_decrypt($encrypted, 'aes-256-cbc', $key, 0, $iv);
使用 Sodium 扩展
Sodium 是一个现代加密库,PHP 7.2+ 内置支持。以下是使用 Sodium 进行加密解密的示例:
$key = sodium_crypto_secretbox_keygen();
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$message = "Secret message";
// 加密
$ciphertext = sodium_crypto_secretbox($message, $nonce, $key);
// 解密
$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
使用 Mcrypt 扩展(已废弃)
虽然 Mcrypt 在 PHP 7.1 中被移除,但在旧版本中仍可使用。以下是 Mcrypt 的示例:
$key = "ThisIsASecretKey";
$data = "Data to encrypt";
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
// 加密
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv);
// 解密
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encrypted, MCRYPT_MODE_CBC, $iv);
使用 Libsodium 进行公钥加密
Libsodium 还支持非对称加密:
$alice_keypair = sodium_crypto_box_keypair();
$alice_public = sodium_crypto_box_publickey($alice_keypair);
$alice_secret = sodium_crypto_box_secretkey($alice_keypair);
$bob_keypair = sodium_crypto_box_keypair();
$bob_public = sodium_crypto_box_publickey($bob_keypair);
$message = "Hello Bob";
// 加密
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$encrypted = sodium_crypto_box($message, $nonce, $bob_public, $alice_secret);
// 解密
$decrypted = sodium_crypto_box_open($encrypted, $nonce, $alice_public, $bob_secret);
使用 Hash 进行单向加密
对于密码存储等单向加密场景,可以使用 password_hash:
$password = "user_password";
$hash = password_hash($password, PASSWORD_DEFAULT);
// 验证
if (password_verify($password, $hash)) {
// 密码匹配
}
注意事项
- 始终使用强加密算法(如 AES-256、ChaCha20)
- 确保 IV/nonce 是随机且唯一的
- 妥善管理加密密钥
- 对于密码存储,使用专门函数如 password_hash
- 考虑使用 PHP 7.2+ 的 Sodium 扩展作为首选







