Laravel 中的临时切换应用程序密钥并将其用于字符串的加密/解密

问题描述

我想使用 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...");

解密您的有效载荷。