首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >随机RuntimeException:仅支持密钥长度正确的AES-128-CBC和AES-256-CBC

随机RuntimeException:仅支持密钥长度正确的AES-128-CBC和AES-256-CBC
EN

Stack Overflow用户
提问于 2017-01-09 23:44:08
回答 4查看 3.4K关注 0票数 21

我在Laravel 5.3 (在windows服务器上)也遇到了同样的问题。我做了所有可能的尝试:检查.env文件、配置、artisan新密钥生成、缓存:清除、配置:清除、作曲器更新,但问题仍然存在。

请注意,使用完全相同版本的apache、mysql、php编写的相同代码在Mac OS上不会产生此问题。

我发现密钥( Encrypter构造器的第一个参数)“有时”到达时是空的,当然它会失败。在大多数情况下,密钥是正确的,但随机地,密钥从EncryptionServiceProvider到达时是空的,这反过来会要求它进入应用程序配置。

因此,对我有效的唯一解决方案是在EncryptionServiceProvider中添加一个if ($key),这样加密构造函数就不会被调用为空密钥。

当然,这不是一个“干净”的解决方案,也不能解释问题,但至少避免了查找充满错误的日志文件:

RuntimeException:仅支持AES-128-CBC和AES-256-CBC两种密码,页面显示正确。

如果这是一个Laravel错误,我不知道,但当然,如果有人能解释这一点,我会很高兴知道。

下面是我修改后的类:我只是在new Encrypter之前添加了if ($key)

class EncryptionServiceProvider extends ServiceProvider
{
    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('encrypter', function ($app) {
            $config = $app->make('config')->get('app');

            // If the key starts with "base64:", we will need to decode the key before handing
            // it off to the encrypter. Keys may be base-64 encoded for presentation and we
            // want to make sure to convert them back to the raw bytes before encrypting.
            if (Str::startsWith($key = $config['key'], 'base64:')) {
                $key = base64_decode(substr($key, 7));
            }
        if ($key)
            return new Encrypter($key, $config['cipher']);
        });
    }
}

更多详细信息和回溯日志:

当然,在我写这篇文章的时候,我检查了.env文件、配置、artisan新密钥生成、缓存:清除、配置:清除、作曲器更新。这个东西是好的,因为它工作的99%的时间,但随机我得到的错误。

下面是回溯:

AES 2017-01-09 10:25:40 test.ERROR: RuntimeException:目前仅支持密钥长度正确的AES-128-CBC和AES-256-CBC。在C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\Encrypter.php:43中

堆栈跟踪:

#0 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Encryption\EncryptionServiceProvider.php(27): Illuminate\Encryption\Encrypter->__construct('', 'AES-256-CBC')
#1 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(746): Illuminate\Encryption\EncryptionServiceProvider->Illuminate\Encryption\{closure}(Object(Illuminate\Foundation\Application), Array)
#2 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build(Object(Closure), Array)
#3 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('encrypter', Array)
#4 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(864): Illuminate\Foundation\Application->make('encrypter')
#5 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(819): Illuminate\Container\Container->resolveClass(Object(ReflectionParameter))
#6 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(788): Illuminate\Container\Container->getDependencies(Array, Array)
#7 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Container\Container.php(644): Illuminate\Container\Container->build('App\\Http\\Middle...', Array)
#8 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Application.php(709): Illuminate\Container\Container->make('App\\Http\\Middle...', Array)
#9 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(127): Illuminate\Foundation\Application->make('App\\Http\\Middle...')
#10 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#11 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\View\Middleware\ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#12 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#13 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#14 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Session\Middleware\StartSession.php(64): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#15 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure))
#16 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#17 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#18 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure))
#19 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#20 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#21 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(655): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#22 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(629): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request))
#23 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Router.php(607): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request))
#24 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(268): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request))
#25 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(53): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request))
#26 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode.php(46): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#27 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(137): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure))
#28 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Routing\Pipeline.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request))
#29 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request))
#30 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(150): Illuminate\Pipeline\Pipeline->then(Object(Closure))
#31 C:\Apache24\htdocs\sph\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php(117): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request))
#32 C:\Apache24\htdocs\sph\public\index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request))
#33 {main}  
EN

回答 4

Stack Overflow用户

发布于 2017-05-02 14:39:16

在多线程web服务器上使用线程安全版本的PHP而不是多进程web服务器时,会出现此问题。您可以在Github issue hereGithub issue herePHP bug report here上阅读有关此问题的更多信息。还有更多的链接,但它们只是我发布的几个链接的分支。

基本要点是,对于多线程web服务器,您只有一个处理多线程的进程。但是,putenv()/getenv()方法不是线程安全的,并且会在进程级别更改环境变量,因此该进程下的所有线程都会受到影响。

因此,您最终会得到如下结果:(如this issue中所述):

Request 1: {starts --- loads env --- work --- finishes}
Request 2:                             {starts ----- loads env --- work --- finishes}

因此,请求1进入,加载环境良好,并开始工作。当请求1正在工作时,请求2进入并在另一个线程上启动。在Request2读取环境变量之前,Request1完成,PHP清除所有由putenv()设置的变量。现在,请求2尝试读取环境,但得到null,因为当请求1完成时,变量已被清除。

可以通过两种方式缓解此问题:

  1. 不要在生产环境中使用.env文件。直接设置环境变量,禁用phpdotenv。这也是package itself的建议:

phpdotenv是为开发环境而设计的,通常不应该在生产中使用。在生产中,应该设置实际的环境变量,以便不会在每次请求时加载.env文件。

  1. 从不在配置文件之外使用env()方法,并确保缓存配置文件。通过使用此方法,环境只读取一次:当您创建配置文件缓存时。每个实际的web请求都将从缓存中读取数据,并且环境变量将永远不会再被触及。
票数 10
EN

Stack Overflow用户

发布于 2017-04-07 19:20:59

我安装了Laravel 5.3,但没有找到.env文件。然后轰隆一声。这就是问题所在。我在应用程序的根目录中创建了.env文件并运行

php工匠密钥:generate

在终端中生成base64编码字符串。将该字符串复制到.env文件中

APP_KEY=base64:************************************************

其中*是生成的编码字符串。再次运行应用程序,它应该可以工作。

票数 0
EN

Stack Overflow用户

发布于 2020-04-15 04:18:33

APP_KEY密码如果选择AES-256-CBC,则长度必须为32个字符。

'key' => env('APP_KEY')

'cipher' => 'AES-256-CBC'

APP_KEY=base64:iT7PDx7j8yKVTj0AW81vTnEQmqLwnVfW => 32个字符

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41551622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档