PHP 7.1 废弃 mcrypt 是因其实质性设计缺陷与安全风险:算法歧义、无认证加密、零填充不合规、IV复用无警告;openssl 提供标准化AEAD、PKCS#7填充及跨语言兼容性,是唯一可靠替代。

PHP 7.1 废弃 mcrypt 并推荐用 openssl 替代,根本原因不是版本任性升级,而是 mcrypt 扩展长期存在设计缺陷、安全风险高、维护停滞,已无法满足现代加密实践要求。
mcrypt 本身已被淘汰多年
mcrypt 自 2007 年起就停止维护,底层依赖过时的加密库,缺乏对现代密码学标准的支持。PHP 官方早在 2015 年就明确建议弃用,7.1 版本只是正式落实这一技术决策——它不是“新增限制”,而是“清理历史包袱”。
关键缺陷无法修复
-
算法歧义严重:例如
MCRYPT_RIJNDAEL_128实际表示块大小为 128 位,不等于标准 AES-128(密钥长度 128 位),导致与 OpenSSL、Java、Go 等其他语言完全不兼容 - 无认证加密能力:仅提供机密性,无法校验数据是否被篡改,易受填充预言攻击(padding oracle)
- 默认零填充(Zero Padding):不满足 PKCS#7 标准,解密时需手动处理边界,极易因截断或误判导致乱码或崩溃
- IV 复用无警告:允许重复使用相同 IV,严重削弱 CBC 等模式安全性
openssl 提供标准化、可验证的替代路径
OpenSSL 扩展基于广泛审计的 libcrypto,支持完整 AEAD 模式(如 AES-GCM)、强制 PKCS#7 填充、明确的算法标识(如 AES-128-CBC),且与主流平台(微信、支付宝、小程序、Java、Python)加解密结果一致。迁移后代码更健壮,也更容易做跨语言联调。
PHP 8 后续演进进一步印证该选择
PHP 8.1 起废弃 openssl_random_pseudo_bytes(),转而强制使用密码学安全的 random_bytes();8.2 对哈希和密钥导出增加类型校验——整条路径都在向 FIPS/NIST 推荐实践靠拢。mcrypt 不仅被淘汰,连“回退选项”都彻底关闭了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











