问题描述
我想使用 Laravel 的 8 Illuminate\Support\Facades\Crypt 但使用不同的密钥。是否有可用的软件包或可以完成?我尝试了加密消息,然后更改密钥和旧密钥:
config(['app.key' => 'base64:aesKxxmsf0Vtqyuf2s1QK/7zuhu3dB+w+....']);
之前
Crypt::decryptString("eyJpdiI6IitxMVhrU2RBV0VLbSt3UjRzN0xabkE9PSIsInZhbHVlIjoiaDBtWUtiUzc0QVRQdXoyM2ZCeVAyZz09IiwibWFjIjoiYTQwYzdkNzgwODAzNGVlYjM2NDZiM2Y4M2NhYTA2ZjE2NjFhZjFiNTYwN2U1NzVhNWVlZDM...");
但这并没有触发临时密钥更改,因为我收到此错误:
Illuminate\Contracts\Encryption\DecryptException
The MAC is invalid.
当我将其改回旧密钥时,一切正常。
所以我猜密钥已经在内存中用于Crypt::decryptString。
你有什么想法吗?
解决方法
Laravel 在 Illuminate\Encryption\EncryptionServiceProvider
内的引导过程中将加密器注册为单例,因此一旦服务提供者运行,更改应用程序密钥不会做任何事情。
您最好的选择可能是像这样创建一个自己的加密器实例:
$encrypter = new Illuminate\Encryption\Encrypter(base64_decode($appKey),config('app.cipher'))
其中 $appKey
是您希望用于解码的密钥,没有 base64:
前缀。
然后你就可以打电话
$encrypter->decryptString("eyJpdiI6IitxMVhrU2RBV0VLbSt3UjRzN0xabkE9PSIsInZhbHVlIjoiaDBtWUtiUzc0QVRQdXoyM2ZCeVAyZz09IiwibWFjIjoiYTQwYzdkNzgwODAzNGVlYjM2NDZiM2Y4M2NhYTA2ZjE2NjFhZjFiNTYwN2U1NzVhNWVlZDM...");
解密您的有效载荷。