PHP 7.2中mcrypt无法使用怎么办?求解决方案或替代方法
解决PHP 7.2中mcrypt无法使用的问题
首先得明确:PHP 7.2已经彻底移除了mcrypt扩展,这就是你看到MCRYPT_RIJNDAEL_128未定义警告的核心原因——这个常量和所有mcrypt相关函数都从PHP核心中被删掉了,官方早在PHP 7.1就标记mcrypt为废弃状态,因为它的维护早已停止,安全性远不如现代加密库。
下面给你两种可行的处理方案,优先推荐第一种:
方案一:迁移到OpenSSL扩展(推荐)
OpenSSL是PHP默认启用的核心扩展,安全性更高、维护更活跃,完全可以替代mcrypt实现AES加密解密。下面是针对AES-128(对应原来的MCRYPT_RIJNDAEL_128)的替代代码示例:
加密示例
function aes_encrypt($data, $key, $iv) { // 确保密钥长度符合AES-128要求(16字节) $key = substr($key, 0, 16); // OpenSSL的AES-128-CBC对应MCRYPT_RIJNDAEL_128 + CBC模式 $encrypted = openssl_encrypt( $data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv ); // 转成base64方便存储传输,和mcrypt的输出格式对齐 return base64_encode($encrypted); }
解密示例
function aes_decrypt($encryptedData, $key, $iv) { $key = substr($key, 0, 16); $encryptedData = base64_decode($encryptedData); $decrypted = openssl_decrypt( $encryptedData, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv ); // 兼容mcrypt的零填充,去除末尾空字符 return rtrim($decrypted, "\0"); }
关键注意点:
- 确保
$iv的长度是16字节(和AES-128匹配),和你原来mcrypt代码中的iv保持一致 - 如果原来的mcrypt用了ECB模式,可对应调整OpenSSL参数为
AES-128-ECB,但ECB模式不安全,建议改用CBC - OpenSSL默认用PKCS7填充,而mcrypt默认是零填充,所以解密后需要用
rtrim($decrypted, "\0")去除多余空字符
方案二:强行安装mcrypt扩展(不推荐)
如果因为历史代码包袱必须使用mcrypt,也可以尝试安装,但要注意:
- 该扩展已停止维护,存在明确安全风险
- 在PHP 7.2+版本中安装需要额外操作:
- 从PECL获取对应PHP版本的mcrypt源码
- 编译安装扩展,或者在XAMPP中找到支持PHP7.2的mcrypt DLL文件,配置到
php.ini中
- 即使安装成功,未来PHP版本会彻底淘汰该扩展,长远来看还是得迁移到OpenSSL
警告: 继续使用mcrypt会带来安全隐患,官方强烈建议迁移到OpenSSL或其他现代加密库。
内容的提问来源于stack exchange,提问作者Rohan Parkar
相关产品推荐
相关产品推荐

