PHP实现AES加密:现代标准与废弃mcrypt的对比
AES(高级加密标准)是业界广泛使用的对称加密算法。在PHP开发历史中,mcrypt 扩展曾广泛用于实现AES加密,但该扩展因安全性维护停止已在 PHP 7.1+ 中被移除。本文将提供一份基于原生 openssl 扩展的现代 AES 加密类代码,并解析其使用方法和关键参数。
为什么需要更新加密方法
许多旧教程或遗留代码库中仍可见 mcrypt_encrypt 和 mcrypt_decrypt 函数。随着服务器环境的升级(如迁移至 PHP 7.2 或更高版本),继续使用这些函数会导致 fatal error。此外,mcrypt 存在一些设计缺陷,而 openssl 作为底层密码学库,提供了更规范、更安全且持续维护的功能支持。
准备条件与注意事项
- 环境检查:确保你的 PHP 版本支持
openssl扩展(绝大多数现代 PHP 安装默认包含)。 - 密钥与IV长度:对于 AES-128,密钥长度必须严格为 16 字节;对于 AES-256,则为 32 字节。初始化向量(IV)长度固定为 16 字节。
- Base64处理:密文通常是二进制数据,传输或存储前通常需要使用 Base64 编码进行转换,以便以文本形式安全传递。
- 风险提醒:
openssl操作涉及敏感数据,请勿将密钥硬编码在可公开访问的代码文件中,建议使用环境变量或配置管理工具。
第1步:创建现代AES加密类
以下代码封装了 openssl_encrypt 和 openssl_decrypt 方法,实现了兼容常见需求的 AES-128-CBC 模式加密:
<?php
class AESOpenSSL {
private $cipher = 'aes-128-cbc';
private $key;
private $iv;
public function __construct($key, $iv) {
// 确保Key和Iv长度正确
if (strlen($key) !== 16 || strlen($iv) !== 16) {
throw new Exception('Key must be 16 bytes and IV must be 16 bytes for AES-128.');
}
$this->key = $key;
$this->iv = $iv;
}
public function encrypt($data) {
$encrypted = openssl_encrypt(
$data,
$this->cipher,
$this->key,
OPENSSL_RAW_DATA,
$this->iv
);
// 返回Base64编码后的字符串,便于网络传输或存入数据库
return base64_encode($encrypted);
}
public function decrypt($data) {
// 先进行Base64解码
$decodedData = base64_decode($data);
$decrypted = openssl_decrypt(
$decodedData,
$this->cipher,
$this->key,
OPENSSL_RAW_DATA,
$this->iv
);
if ($decrypted === false) {
throw new Exception('Decryption failed.');
}
return $decrypted;
}
}
?>
第2步:执行加密与解密操作
在实际业务场景中,你可以按照以下方式调用上述类:
<?php
// 1. 定义密钥和初始向量(IV)。IV不需要保密,但必须唯一且随机。
$key = 'abcdef1234567890'; // 16字符
$iv = '0987654321fedcba'; // 16字符
try {
$aes = new AESOpenSSL($key, $iv);
// 2. 明文数据
$plainText = 'haowei.me';
// 3. 执行加密
$encryptedStr = $aes->encrypt($plainText);
echo '加密后: ' . $encryptedStr . PHP_EOL;
// 4. 执行解密
$decryptedText = $aes->decrypt($encryptedStr);
var_dump($decryptedText); // 输出字符串 'haowei.me'
} catch (Exception $e) {
echo '错误: ' . $e->getMessage();
}
?>
总结
通过弃用老旧的 Mcrypt 并转向 OpenSSL,开发者可以获得更可靠的加密体验。上述 AES-128-CBC 方案简单易懂,适合大多数非金融级核心场景。若需更高安全性,建议进一步研究 AES-GCM 模式或引入专业的第三方密码学库。
以上就是PHP实现AES加密的正确与现代做法的详细内容,更多关于PHP加密技术的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









