结论:生产环境禁用DES-CBC,优先选AES-256-GCM(新项目)或AES-128-CBC(兼容旧系统);DES-CBC仅限读取遗留数据,PHP 8.3将彻底移除。

PHP里用openssl_encrypt该选AES-128-CBC还是DES-CBC
直接说结论:别用DES-CBC,它在PHP 8.2+已被标记为废弃,且密钥长度仅56位,现代CPU几秒就能暴力破解。生产环境只考虑AES系列,优先选AES-128-CBC或AES-256-GCM。
选型关键不在“名字长短”,而在三件事:是否被主流库默认支持、是否有硬件加速、是否自带完整性校验。比如AES-128-CBC在所有PHP版本中稳定可用,但需手动管理IV和HMAC;而AES-256-GCM一步到位支持加密+认证,但PHP 7.1以下不支持,且部分旧服务器缺少AES-NI指令集,性能反而不如CBC。
-
AES-128-CBC:适合兼容性要求高、已有IV/HMAC逻辑的旧系统 -
AES-256-GCM:新项目首选,但必须确认openssl_get_cipher_methods()返回列表里含aes-256-gcm -
DES-CBC:仅限读取遗留数据,禁止用于新加密,PHP 8.3起会彻底移除
为什么mcrypt扩展的MCRYPT_DES不能直接换成openssl的DES-CBC
看似只是函数换掉,实际是两套完全不同的填充与密钥派生逻辑。mcrypt默认用零填充(zero-padding),openssl默认用PKCS#7;mcrypt对不足8字节的密钥会截断或补零,openssl则直接报错Failed to set key length。
迁移时最容易卡在密钥处理上——比如旧代码用md5($password)当DES密钥,直接塞进openssl_encrypt会因长度不对失败。必须显式截取前8字节:substr(md5($password), 0, 8),且要同步改IV生成方式(mcrypt常用mcrypt_create_iv(8, MCRYPT_RAND),openssl得用random_bytes(8))。
立即学习“PHP免费学习笔记(深入)”;
- 密钥长度:DES必须是8字节,AES-128必须是16字节,AES-256必须是32字节
- IV长度:DES和AES都是块大小(DES=8,AES=16),且必须每次加密都重生成
- 填充方式:
openssl不提供自动零填充,需自己补足或改用PKCS7并调用openssl_pkcs7_encrypt
用AES-256-GCM时$tag参数漏传会导致解密静默失败
openssl_encrypt调用AES-256-GCM时,第5个参数$tag是引用传参,必须传一个变量名,否则加密结果虽能生成,但解密时openssl_decrypt会返回false且不报错——因为GCM模式下认证标签(tag)缺失,OpenSSL直接拒绝解密,连错误码都不抛。
典型错误写法:openssl_encrypt($data, 'aes-256-gcm', $key, 0, $iv),漏了&$tag。正确写法必须带引用:openssl_encrypt($data, 'aes-256-gcm', $key, 0, $iv, $tag),然后把$tag和$iv一起存下来,解密时原样传入。
-
$tag长度固定16字节,不可截断或base64_encode后丢高位 - IV长度仍为12字节(GCM推荐值),不是AES标准的16字节,用错会解密失败
- PHP 7.1+才支持GCM,低于此版本调用会警告
Unknown cipher
PHP 8.1+启用OPENSSL_AEAD_TAG_LEN常量意味着什么
这个常量不是用来“开启功能”的,而是告诉你当前OpenSSL库编译时支持的GCM最大tag长度。PHP 8.1引入它,是因为新版OpenSSL允许自定义tag长度(如12/13/14/15/16字节),但PHP只暴露了16字节接口。如果你看到OPENSSL_AEAD_TAG_LEN === 16,说明底层支持完整GCM;如果等于0,大概率是用了阉割版OpenSSL(如某些Alpine小镜像)。
真正影响使用的是openssl_get_cipher_methods()返回值——只要含aes-*-gcm,就代表可用;而OPENSSL_AEAD_TAG_LEN只是辅助判断底层是否真支持AEAD模式,不参与实际加解密流程。
- 无需在代码里判断该常量,除非你主动想降级tag长度(不建议)
- Docker部署时若遇到GCM不可用,先
php -r "print_r(openssl_get_cipher_methods());"确认方法列表,再查基础镜像OpenSSL版本 - Windows下PHP官方二进制包默认不带GCM,需自行编译或换用XAMPP等集成环境











