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

标签: phplaravelencryption

解决方案


密钥采用 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从配置数组中检索密钥。


推荐阅读