php实现加解密
PHP 实现加密与解密的方法
使用 OpenSSL 扩展进行 AES 加密解密
OpenSSL 提供了强大的加密功能,支持 AES(高级加密标准)。以下是 AES-256-CBC 模式的示例:
$method = 'aes-256-cbc';
$key = openssl_random_pseudo_bytes(32); // 生成随机密钥
$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length($method));
// 加密
$plaintext = "敏感数据";
$ciphertext = openssl_encrypt($plaintext, $method, $key, 0, $iv);
// 解密
$decrypted = openssl_decrypt($ciphertext, $method, $key, 0, $iv);
确保妥善保存 $key 和 $iv,解密时需要它们。可以将 $iv 与密文一起存储,但密钥必须保密。
使用 password_hash 和 password_verify 进行密码哈希
对于密码存储,推荐使用 PHP 内置的密码哈希函数:

// 创建密码哈希
$password = "user_password";
$hash = password_hash($password, PASSWORD_DEFAULT);
// 验证密码
if (password_verify($password, $hash)) {
// 密码匹配
}
PASSWORD_DEFAULT 会自动使用当前最安全的算法(如 bcrypt)。无需手动处理盐值,函数会自动生成。
使用 Sodium 扩展进行现代加密
PHP 7.2+ 内置的 Sodium 扩展提供了更现代的加密方式:

// 生成密钥对
$key_pair = sodium_crypto_box_keypair();
$public_key = sodium_crypto_box_publickey($key_pair);
$secret_key = sodium_crypto_box_secretkey($key_pair);
// 加密
$message = "秘密消息";
$nonce = random_bytes(SODIUM_CRYPTO_BOX_NONCEBYTES);
$ciphertext = sodium_crypto_box($message, $nonce, $public_key, $secret_key);
// 解密
$decrypted = sodium_crypto_box_open($ciphertext, $nonce, $public_key, $secret_key);
Sodium 提供了更安全的默认参数和更简单的 API,适合现代应用程序。
使用 hash_hmac 进行数据验证
HMAC(哈希消息认证码)可用于验证数据完整性:
$data = "需要验证的数据";
$secret = "共享密钥";
$hmac = hash_hmac('sha256', $data, $secret);
// 验证时重新计算并比较
$received_hmac = "...";
if (hash_equals($hmac, $received_hmac)) {
// 数据未被篡改
}
注意使用 hash_equals 而不是直接比较,以防止时序攻击。
注意事项
- 永远不要使用已弃用的函数如
mcrypt_* - 对于密码存储,必须使用专门设计的函数如
password_hash - 加密密钥必须妥善保管,考虑使用密钥管理服务
- 在 Web 应用中,考虑使用 HTTPS 保护传输中的数据
- 定期更新加密库和 PHP 版本以获取安全补丁
根据具体需求选择合适的加密方法。数据加密选择对称加密如 AES,密码存储使用专门哈希函数,数据传输考虑非对称加密或 TLS。






