php - 当payload突然变为NULL时如何解决Laravel 8中的“payload is invalid”
问题描述
尝试解密以前加密的密码时,我不断收到此错误:
The payload is invalid.
这是相关的堆栈跟踪:
#0 /home/improojf/public_html/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php(136): Illuminate\Encryption\Encrypter->getJsonPayload(NULL)
#1 /home/improojf/public_html/vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php(164): Illuminate\Encryption\Encrypter->decrypt('eyJpdiI6InloT0U...', false)
#2 /home/improojf/public_html/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\Encryption\Encrypter->decryptString('eyJpdiI6InloT0U...')
#3 /home/improojf/public_html/app/Models/Server.php(29): Illuminate\Support\Facades\Facade::__callStatic('decryptString', Array)
#4 /home/improojf/public_html/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(473): Server->getPasswordAttribute('eyJpdiI6InloT0U...')
这里最大的问题是NULL
加密器代码中随机出现了一个字符串,这对我来说毫无意义。
另一个问题是,一些记录只是表现得像广告一样。
我有什么用它用于 在数据库上存储 smtp/pop3 服务器的密码
我尝试了什么 这个问题通过不加密/解密密码完美解决,这弄乱了目的
它总是返回错误吗?不,实际上有些记录表现正常
我的猜测 php artisan cache:clear
可能是其他地方报道的一种选择,但我认为应该有另一种解决方案。到目前为止,我有(未经测试)以下访问器,而之前我只有第二个 try/catch
public function getPasswordAttribute($value){
try {
return Crypt::decryptString($value);
} catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
\Illuminate\Support\Facades\Artisan::call('cache:clear');
}
try {
return Crypt::decryptString($value);
} catch (\Illuminate\Contracts\Encryption\DecryptException $e) {
if(app()->runningUnitTests())
return $value;
else
throw $e;
}
}
解决方案
根据官方文档
Laravel 的加密服务提供了一个简单、方便的接口,用于通过 OpenSSL 使用 AES-256 和 AES-128 加密来加密和解密文本。
Laravel 的所有加密值都使用消息验证码 (MAC) 进行签名,因此它们的底层值不能被修改或篡改一次
在使用 Laravel 的加密器之前,您必须在 config/app.php 配置文件中设置密钥配置选项。
这意味着加密解密取决于app key
值。如果生成新的应用程序密钥,那么旧的加密值将不适用于新的应用程序密钥
参考:https ://laravel.com/docs/8.x/encryption
更新
问题是由于数据类型 varchar(191),加密值部分存储在数据库表中。
所以最好将数据类型更改varchar(191)
为longtext
或text
推荐阅读
- azure - 有没有办法从 ADF CI/CD 中的文件中引用 overrideParameters?
- angular - 如何在 jhipster 的“home.component.html”上显示/显示多个实体?
- terraform - 如何将 terraform 状态上传到 s3 存储桶?
- google-apps-script - 仅将非空单元格附加到另一个工作表谷歌脚本
- python - Python:带空格的 str.split() 给出索引错误
- javascript - 成功获取后如何打印成功消息?
- flutter - 未找到 MaterialApp 中的 Inkwell
- c++ - 在输入一个超出无符号短整数范围的整数后,打印无符号短整数值的规则是什么?
- java - Java中excel文档的搜索算法
- python - 加载音乐期间未定义的 pygame 错误