Laravel 应用程序中应用程序键的意义是啥?

Posted

技术标签:

【中文标题】Laravel 应用程序中应用程序键的意义是啥?【英文标题】:What is the significance of Application key in a Laravel Application?Laravel 应用程序中应用程序键的意义是什么? 【发布时间】:2018-09-01 21:07:30 【问题描述】:

来自 laravel docs

Application Key 安装 Laravel 后你应该做的下一件事 将您的应用程序密钥设置为随机字符串。如果你安装了 Laravel 通过 Composer 或 Laravel 安装程序,这个密钥已经 已由 php artisan key:generate 命令为您设置。

通常,该字符串的长度应为 32 个字符。关键可以是 在 .env 环境文件中设置。如果你还没有重命名 .env.example 文件到 .env,你现在应该这样做。 如果申请 未设置密钥,您的用户会话和其他加密数据将不会 确保安全!

我对应用程序密钥的了解是:如果未设置应用程序密钥,通常我会遇到异常。

此随机字符串如何帮助确保会话安全? 此应用程序密钥的其他用途是什么? 如果我在任何地方都使用相同的应用程序密钥(如登台、生产等),是否会降低应用程序的安全性? 此键有哪些最佳做法

【问题讨论】:

请解释一下否决票。这样我可以在必要时删除这篇文章。谢谢 如果我在任何地方(如登台、生产等)都使用相同的应用程序密钥,是否会降低应用程序的安全性?我什至会在每次部署时重置登台密钥。 所以每个会话都无效:),除了来自config/app.php 的那个:这个密钥被 Illuminate 加密服务使用... 我不知道为什么要否决这是一个很好的问题,因为我知道它用于 cookie 加密和会话数据加密。可能它在 api 安全性方面有一些作用,但我不知道我从来没有尝试过了解更多,但现在你提出了这个问题,我很好奇 看看这个general community question。 【参考方案1】:

我们可以看到它在EncryptionServiceProvider中使用:

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 = $this->key($config), 'base64:')) 
            $key = base64_decode(substr($key, 7));
        

        return new Encrypter($key, $config['cipher']);
    );

所以每个使用加密的组件:sessionencryption(用户范围)、csrf 令牌都受益于app_key


其余问题可以通过“加密”(AES) 的工作原理来回答,只需打开 Encrypter.php,并确认 Laravel 在后台使用 AES 并将结果编码为 base64。

我们可以进一步了解它是如何使用 tinker 完成的:

➜  laravel git:(staging) ✗ art tinker
Psy Shell v0.8.17 (PHP 7.1.14 — cli) by Justin Hileman
>>> encrypt('Hello World!')
=> "eyJpdiI6ImgzK08zSDQyMUE1T1NMVThERjQzdEE9PSIsInZhbHVlIjoiYzlZTk1td0JJZGtrS2luMlo0QzdGcVpKdTEzTWsxeFB6ME5pT1NmaGlQaz0iLCJtYWMiOiI3YTAzY2IxZjBiM2IyNDZiYzljZGJjNTczYzA3MGRjN2U3ZmFkMTVmMWRhMjcwMTRlODk5YTg5ZmM2YjBjMGNlIn0="

注意:我使用这个密钥:base64:Qc25VgXJ8CEkp790nqF+eEocRk1o7Yp0lM1jWPUuocQ= 加密Hello World!

解码我们得到的结果后(你可以尝试用会话解码你自己的cookie):

"iv":"h3+O3H421A5OSLU8DF43tA==","value":"c9YNMmwBIdkkKin2Z4C7FqZJu13Mk1xPz0NiosfhiPk=","mac":"7a03cb1f0b3b246bc9cdbc573c070dc7e7fad15f1da27014e899a89fc6b0c0ce"

要理解上面的 json (iv, value, mac) 你需要理解 AES:

https://en.wikipedia.org/wiki/Advanced_Encryption_Standard

应用程序密钥的最佳实践

仅将其存储在.env 文件中 不要将其存储在 app.php 中,实际上是任何 git 跟踪的文件中 不要改变它,除非你真的想要 使会话/cookies 无效(用户注销) 使密码重置令牌无效 无效signed urls

明显提示:更改应用程序密钥对散列密码没有影响,因为散列算法不需要加密密钥。

【讨论】:

很详细的回答

以上是关于Laravel 应用程序中应用程序键的意义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在现有 Django 应用程序中更改主键的最佳方法是啥?

具有多列主键的 Laravel 模型

删除包含外键的字段,而不删除该字段包含LARAVEL的所有项目

渴望加载 Laravel 5 与两个外键的多对多关系

提取自增主键的标准做法是啥?

Laravel 中服务容器的概念是啥?