php加密依赖openssl扩展,mcrypt自7.2起已被移除;openssl是当前唯一推荐、默认启用且持续维护的扩展,覆盖全部主流加密需求。

PHP 加密功能依赖哪些扩展
PHP 本身不自带完整加密能力,openssl 和 mcrypt 是两个最常被提到的扩展,但它们定位和现状完全不同:mcrypt 自 PHP 7.2 起已被移除,官方明确废弃,任何新项目都不应再使用;openssl 是当前唯一推荐、默认启用且持续维护的核心扩展,覆盖对称/非对称加密、签名、证书操作等全部主流需求。
检查是否已启用:
php -m | grep openssl
若无输出,说明未启用;若看到 mcrypt,请立即确认 PHP 版本——它只可能存在于 PHP 7.1 及更早版本中,继续使用存在安全与兼容风险。
OpenSSL 扩展安装与验证(Linux/macOS)
多数现代 PHP 环境(如 Ubuntu 的 php-cli、php-fpm 包)已默认编译并启用 openssl,无需额外安装扩展。重点在于确认底层 OpenSSL 库可用:
立即学习“PHP免费学习笔记(深入)”;
- 运行
php -r "print_r(openssl_get_cipher_methods());",有数组输出即表示正常 - 若报错
Call to undefined function openssl_get_cipher_methods(),说明扩展未加载:检查php.ini中是否存在extension=openssl(注意不是extension=php_openssl.dll或类似旧写法) - 某些 Alpine Linux 容器需先
apk add openssl再确保 PHP 编译时启用了--with-openssl
为什么不能装 mcrypt?替代方案是什么
mcrypt 不仅被移除,其底层库 libmcrypt 已多年无维护,存在已知填充漏洞(如 ECB 模式无认证、无 AEAD 支持),且 API 设计僵硬,无法安全实现现代加密流程。
替代必须用 openssl 函数族:
- 对称加密:用
openssl_encrypt()/openssl_decrypt(),支持AES-256-GCM(带认证)、AES-128-CBC(需手动处理 IV 和 padding) - 密钥派生:用
hash_pbkdf2()或password_hash()(仅限密码哈希,不可逆) - 不要试图通过 PECL 或源码编译回退安装
mcrypt——没有安全补丁,也没有 PHP 8 兼容性
常见加密场景下的 OpenSSL 参数要点
直接调用 openssl_encrypt() 时,最容易出错的是参数顺序和 IV 处理:
- 第 1 个参数是明文,第 2 个是算法名(如
'AES-256-GCM'),第 3 个是密钥(必须严格字节长度匹配,AES-256 要 32 字节),第 4 个是选项(通常为 0),第 5 个是 IV(GCM 模式下必须传,且不能重用) -
AES-256-GCM需额外传入第 6 个参数(附加认证数据 AAD),即使为空也要传空字符串,否则返回 false - IV 和密文必须一起保存或传输,但绝不硬编码;建议用
base64_encode()统一封装后再存储 - 避免使用
md5()或sha1()衍生密钥——它们不是密钥派生函数(KDF),应改用hash_pbkdf2('sha256', $password, $salt, $iterations, $length)
加密从来不是“调一个函数就行”的事,密钥管理、IV 生成策略、模式选择、认证完整性——每个环节漏掉一点,就等于没加密。











