payload突然变为NULL时如何解决"The payload is invalid" in Laravel 8
How to solve "The payload is invalid" in Laravel 8 when the payload suddenly becomes NULL
我在尝试解密以前加密的密码时不断收到此错误消息:
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 服务器的密码
我试过的
没有encrypting/decrypting密码就完美解决了这个问题,打乱了目的
是不是总是return错误?不是,其实有些记录是正常的
我的猜测是什么 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's encryption services provide a simple, convenient interface
for encrypting and decrypting text via OpenSSL using AES-256 and
AES-128 encryption.
All of Laravel's encrypted values are signed using a message
authentication code (MAC) so that their underlying value can not be
modified or tampered with once
在使用Laravel的加密器之前,您必须在config/app.php配置文件中设置密钥配置选项。
这意味着加密解密取决于 app key
value.If 生成的新应用密钥然后旧加密值将无法与新应用密钥一起使用
参考:https://laravel.com/docs/8.x/encryption
已更新
由于数据类型为 varchar(191),问题是加密值部分存储在数据库 table 中。
最好将数据类型 varchar(191)
更改为 longtext
或 text
我在尝试解密以前加密的密码时不断收到此错误消息:
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 服务器的密码我试过的 没有encrypting/decrypting密码就完美解决了这个问题,打乱了目的
是不是总是return错误?不是,其实有些记录是正常的
我的猜测是什么 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's encryption services provide a simple, convenient interface for encrypting and decrypting text via OpenSSL using AES-256 and AES-128 encryption.
All of Laravel's encrypted values are signed using a message authentication code (MAC) so that their underlying value can not be modified or tampered with once
在使用Laravel的加密器之前,您必须在config/app.php配置文件中设置密钥配置选项。
这意味着加密解密取决于 app key
value.If 生成的新应用密钥然后旧加密值将无法与新应用密钥一起使用
参考:https://laravel.com/docs/8.x/encryption
已更新
由于数据类型为 varchar(191),问题是加密值部分存储在数据库 table 中。
最好将数据类型 varchar(191)
更改为 longtext
或 text