Laravel应用程序中Application键的意义是什么?

Sho*_*obi 11 php laravel

来自laravel docs

应用程序密钥安装Laravel后,您应该做的下一步是将应用程序密钥设置为随机字符串.如果通过作曲家或Laravel安装程序安装Laravel,这个密钥已经被设置为你的PHP工匠键:生成命令.

通常,此字符串应为32个字符长.密钥可以在.env环境文件中设置.如果您尚未将.env.example文件重命名为.env,则应立即执行此操作.如果未设置应用程序密钥,则您的用户会话和其他加密数据将不安全!

我对应用程序密钥的了解是:如果未设置应用程序密钥,通常我会得到一个例外.

  • 这个随机字符串如何帮助保护会话?
  • 此应用程序密钥的其他用途是什么?
  • 如果我在任何地方使用相同的应用程序密钥(如登台,生产等等),是否会降低应用程序的安全性?
  • 这个密钥的最佳实践是什么?

Kys*_*lik 15

我们可以看到它用于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']);
    });
}
Run Code Online (Sandbox Code Playgroud)

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


其余的问题可以通过"如何加密"(AES)工作,只是打开Encrypter.php,并确认Laravel在引擎盖下使用AES并将结果编码为base64 来回答.

通过使用修补程序,我们可以看到它是如何完成的:

?  laravel git:(staging) ? art tinker
Psy Shell v0.8.17 (PHP 7.1.14 — cli) by Justin Hileman
>>> encrypt('Hello World!')
=> "eyJpdiI6ImgzK08zSDQyMUE1T1NMVThERjQzdEE9PSIsInZhbHVlIjoiYzlZTk1td0JJZGtrS2luMlo0QzdGcVpKdTEzTWsxeFB6ME5pT1NmaGlQaz0iLCJtYWMiOiI3YTAzY2IxZjBiM2IyNDZiYzljZGJjNTczYzA3MGRjN2U3ZmFkMTVmMWRhMjcwMTRlODk5YTg5ZmM2YjBjMGNlIn0="
Run Code Online (Sandbox Code Playgroud)

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

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

{"iv":"h3+O3H421A5OSLU8DF43tA==","value":"c9YNMmwBIdkkKin2Z4C7FqZJu13Mk1xPz0NiOSfhiPk=","mac":"7a03cb1f0b3b246bc9cdbc573c070dc7e7fad15f1da27014e899a89fc6b0c0ce"}
Run Code Online (Sandbox Code Playgroud)

了解上述JSON( ,iv,value)mac你需要了解AES:


应用程序密钥的最佳实践

  • 不要将它存储在.env文件中只
  • 不要将它存储app.php在任何git跟踪文件中
  • 除非你真的想要,否则不要改变它
    • 会话/ cookie无效(用户注销)
    • 使密码重置令牌无效
    • 使签名的网址无效

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