PHP7.1起mcrypt系列函数被彻底移除,须改用openssl_encrypt/decrypt并手动处理PKCS#7填充;PHP8.1起openssl_random_pseudo_bytes废弃,应改用random_bytes;PHP8强化hash_hmac和password_hash类型校验;PHP8.2要求gmp_import/export显式指定word_size参数。

PHP7中mcrypt_*系列函数彻底不可用
PHP7.1起已移除mcrypt扩展,不是弃用警告,而是直接报Fatal error: Uncaught Error: Call to undefined function mcrypt_encrypt()。很多老项目依赖mcrypt_encrypt()、mcrypt_module_open()等做AES/CBC加解密,升级后必然崩。
替代方案只有openssl_encrypt()和openssl_decrypt(),但参数顺序、填充方式、IV处理逻辑完全不同:
-
mcrypt默认使用零填充(Zero Padding),而openssl默认不自动填充,需手动补PKCS#7 -
mcrypt的mode参数是字符串如"cbc",openssl对应的是"AES-128-CBC"这类完整算法标识 -
mcrypt中IV长度由算法决定(如AES为16字节),openssl要求IV必须严格匹配加密模式所需长度,且不能复用
示例迁移要点:
原mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_CBC, $iv) → 改为openssl_encrypt($data, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv),但前提是$data已按PKCS#7补足块长,且$key必须是16/24/32字节(对应AES-128/192/256)。
PHP8.1起openssl_random_pseudo_bytes()被废弃
这个函数在PHP8.1标记为Deprecated,PHP8.2正式移除。它曾常用于生成密钥或IV,但底层依赖已过时的伪随机数生成器(PRNG),安全性不足。
必须改用random_bytes()——它是密码学安全的、基于系统熵源(/dev/urandom、CryptGenRandom等):
立即学习“PHP免费学习笔记(深入)”;
-
random_bytes(32)返回32字节二进制字符串,可直接作AES-256密钥 - 生成IV也应同样调用:
$iv = random_bytes(openssl_cipher_iv_length('AES-128-CBC')) - 注意:
random_bytes()可能抛出Exception(如系统熵不足),生产环境需捕获RuntimeException
PHP8对hash_hmac()和password_hash()无破坏性变更,但行为更严格
这两个函数本身没被废弃,但PHP8强化了类型校验和错误路径:
- 传入
null或array给hash_hmac()的$data参数,PHP7可能静默转成字符串,PHP8直接报TypeError -
password_hash()在PHP8中对$options数组键名校验更严,比如错写'cost'为'Cost'会触发警告而非忽略 - PHP8.0起
password_hash()默认算法从bcrypt升级为argon2id(若编译时启用了libsodium),但仅当显式指定PASSWORD_ARGON2ID才生效;未指定时仍用bcrypt,兼容旧逻辑
建议:所有哈希操作统一用password_hash($pwd, PASSWORD_ARGON2ID, ['memory_cost'=>65536, 'time_cost'=>4]),并用password_verify()验证——它能自动识别散列格式,无需关心PHP版本差异。
PHP8.2移除了gmp_import()/gmp_export()的$word_size参数默认值
这两个函数常用于RSA密钥处理(如将大整数转为二进制序列)。PHP8.2起,$word_size参数不再有默认值,必须显式传入1(字节)或4(32位字)等,否则报ArgumentCountError。
典型影响场景是用phpseclib或自研RSA封装时:
- 旧写法:
gmp_import($binary)→ 必须改为gmp_import($binary, 1, 'big') - 导出同理:
gmp_export($gmp, 1, 'big'),第三个参数$order(大小端)也不能省略 - 注意:
gmp_import()在PHP8中已要求$binary为string,传int或float会触发TypeError
密钥操作容错率低,任何字节错位都会导致解密失败,升级时务必逐个核对gmp_*调用点的参数数量与类型。











