thinkphp项目无官方“tp加密解密插件”,应启用php原生openssl或sodium扩展,禁用已废弃的mcrypt;需确认php -m | grep openssl/sodium有输出,配置正确并重启web服务,再使用openssl_encrypt/decrypt或sodium_crypto_secretbox等函数。

ThinkPHP 项目里没有官方“TP 加密解密插件”这个东西,composer require 直接搜 tp-crypt 或 thinkphp-crypt 会失败或装到废弃包。真正能用、该用的,是 PHP 原生扩展 + 经过验证的通用加密库。
openssl 扩展没启用,openssl_encrypt 就直接报错
TP5/TP6 都不自带加密组件,所有加解密操作最终都落到 openssl 或 sodium 扩展上。很多“安装失败”其实卡在第一步:扩展根本没开。
- 运行
php -m | grep openssl,没输出就说明没启用 - Linux/macOS 检查
php.ini是否有extension=openssl(不是注释状态) - Windows 检查
php.ini中;extension=php_openssl.dll的分号是否已去掉,且php_openssl.dll文件真实存在 - 改完必须重启 PHP-FPM 或 Apache,再用
php -r "var_dump(extension_loaded('openssl'));"确认返回true
paragonie/sodium_compat 装了但 sodium_crypto_secretbox 还是找不到
这是典型环境混淆:你装的是纯 PHP 兼容层,但代码里调用的是原生函数名,而 PHP 又没加载 sodium 扩展——结果就是函数不存在。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
paragonie/sodium_compat不提供sodium_crypto_secretbox()这类全局函数,它只在没原生扩展时自动注册别名;一旦系统有sodium扩展,它就退场 - 先执行
php -m | grep sodium,如果有输出,说明原生扩展已启用,那就不该依赖sodium_compat的函数别名 - 正确做法是:要么启用原生
sodium扩展(PHP 7.2+ 内置),直接用sodium_crypto_secretbox();要么禁用原生扩展,再用sodium_compat并确保调用Sodium\crypto_secretbox()(带命名空间) - 两者共存可能引发符号冲突,不建议
别碰 ircmaxell/php-crypt 这类老包
这类包早在 PHP 7.1 时代就停止维护,不支持 AEAD 模式(如 AES-GCM),也没有常量时间比较,存在时序攻击风险。Composer 装它看似成功,实则埋下安全隐患。
- 它依赖已移除的
mcrypt扩展,在 PHP 7.2+ 上根本跑不起来 - 即使强制
--ignore-platform-reqs装上,运行时也会因ext-mcrypt缺失而 fatal error - 替代方案明确:用
defuse/php-encryption(需--minimum-stability=dev装最新版)或直接用openssl_encrypt+ 正确参数组合 - TP 项目中,把加解密逻辑封装成独立 service 类,避免在控制器里裸写
openssl_*函数,便于测试和密钥管理
vendor/autoload.php 被 Web 直接访问,等于泄露整个类结构
这不是 Composer 安装问题,但和加密安全强相关:一旦攻击者能 GET 到 /vendor/autoload.php,哪怕返回空白,也可能触发 autoloader 初始化并暴露路径、类名甚至错误堆栈。
- Nginx 必须加
location /vendor/ { return 403; },Apache 要确认.htaccess在 vendor 下生效 - 不要以为
composer dump-autoload --optimize能“隐藏”什么——它只优化性能,不影响文件可访问性 - 生产环境最稳妥做法:用
COMPOSER_VENDOR_DIR=/path/outside/webroot/vendor把 vendor 移出 Web 根目录 - TP5/TP6 的
public/index.php必须包含require __DIR__.'/../vendor/autoload.php';,否则扩展类根本不会被加载
加密不是装个包就完事,关键在扩展是否启用、函数是否调对、IV 和密钥是否随机生成、vendor 是否可被直接访问——这几个点漏一个,前面所有配置都白搭。










