首页 > 解决方案 > 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

你有什么想法?

标签: laravellaravel-8crypt

解决方案


Laravel 在引导期间将加密器注册为单例Illuminate\Encryption\EncryptionServiceProvider,因此一旦服务提供者运行,更改应用程序密钥就不会做任何事情。

您最好的选择可能是创建自己的 Encrypter 实例,如下所示:

$encrypter = new Illuminate\Encryption\Encrypter(base64_decode($appKey), config('app.cipher'))

where$appKey是您希望用于解码的密钥,不带前缀base64:

然后你可以打电话

$encrypter->decryptString("eyJpdiI6IitxMVhrU2RBV0VLbSt3UjRzN0xabkE9PSIsInZhbHVlIjoiaDBtWUtiUzc0QVRQdXoyM2ZCeVAyZz09IiwibWFjIjoiYTQwYzdkNzgwODAzNGVlYjM2NDZiM2Y4M2NhYTA2ZjE2NjFhZjFiNTYwN2U1NzVhNWVlZDM...");

解密您的有效载荷。


推荐阅读