php - 在 Laravel 中使用不同的密钥解密
问题描述
我正在使用 Laravel 解密从另一个应用程序(也在 Laravel 中)加密的字符串,但一开始我遇到了问题。
我以这种方式从类中创建了一个新对象\Illuminate\Encryption\Encrypter
,以便使用不同的键而不是默认键:
$new_encypter = new \Illuminate\Encryption\Encrypter("base64:ABCDEFGHIJKLF=", config('app.cipher'));
但我有这个错误:
唯一受支持的密码是具有正确密钥长度的 AES-128-CBC 和 AES-256-CBC。
我使用的密钥是有效密钥,因为它来自另一个可以正常工作并使用相同加密配置的 Laravel 应用程序。
传递给构造函数的密码是正确的,因为在异常跟踪中有这行代码:
Illuminate\Encryption\Encrypter::__construct("base64:ABCDEFGHIJKLF=", "AES-256-CBC")
错误在哪里?
我正在使用 Laravel 6。
解决方案
密钥采用 base64 编码并以 . 为前缀base64:
。您必须删除前缀并对其进行 base64 解码。
这是如何EncryptionServiceProvider
做到的:
// get the app config
$config = $app->make('config')->get('app');
// see if the key starts with 'base64:'
if (Str::startsWith($key = $this->key($config), 'base64:')) {
// decode the key
$key = base64_decode(substr($key, 7));
}
return new Encrypter($key, $config['cipher']);
$this->key()
只是key
从配置数组中检索密钥。
推荐阅读
- xamarin - Xamarin 对认知语音服务的支持
- c++ - 'P1'版本'20100826'和'P2'版本'20080116'之间的C++ Il不匹配
- laravel - 没有配置白名单,没有代码覆盖会产生错误
- javascript - 防止函数名称在缩小时被破坏
- javascript - NodeJS 服务器 - 客户端对响应状态 500 的行为不同,具体取决于响应正文
- android - 将图标添加到包并访问它
- sql-server - 使用存储过程作为外部字典的来源
- excel - 如何使用变量来表示链接?
- linux - 在 Alpine 上从源代码安装 GCC
- ios - 推送uiviewcontroller时滞后