在 Laravel 应用程序中,应用程序密钥的意义是什么?

19

来自 Laravel 文档

应用密钥 安装完 Laravel 后,你需要做的下一件事情就是将你的应用密钥设置为一个随机字符串。如果你是通过 Composer 或 Laravel 安装器安装 Laravel 的,那么这个密钥已经通过 php artisan key:generate 命令为你设置好了。

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

我知道关于应用密钥的是:如果应用密钥未设置,通常会出现异常。

  • 这个随机字符串如何帮助保护会话安全?
  • 应用密钥有哪些其他用途?
  • 如果我在所有地方(例如测试、生产环境等)使用相同的应用密钥,这会使应用程序变得不安全吗?
  • 应用密钥的最佳实践是什么?

如果我在所有地方(如staging、production等)都使用相同的应用程序密钥,这会使应用程序变得不太安全吗?我甚至在每次部署时都会重置staging密钥。 - Kyslik
1
所以每个会话都被无效化了 :), 除此之外,从 config/app.php 中:此密钥由 Illuminate 加密服务使用... - Kyslik
3
我不知道为什么会有人踩这个问题,从我所知道的来看,它在Cookie加密和会话数据加密中被使用。也许它在API安全方面扮演着一些角色,但我不确定。我从未尝试过深入了解它,但现在你提出了这个问题,我感到很好奇。 - Vinay
1
请看这个一般社区问题 - Eazy Sam
@Viney 不,如果我们谈论使用 Passport,该包会生成自己的证书,因此它不用于 API 安全。 - Kyslik
显示剩余2条评论
1个回答

21

它被用于 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']);
    });
}

因此,每个使用加密的组件:会话加密(用户范围)、CSRF 令牌都可以从app_key中受益。


其余的问题可以通过了解加密方式(AES)的工作原理来回答,打开Encrypter.php文件,并确认Laravel在内部使用AES,并且该实现将结果编码为base64。

以下是使用tinker的示例:

➜  artisan 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(ivvaluemac),您需要了解AES:


应用密钥的良好实践

  • 仅将其存储在.env文件中
  • 不要将其存储在app.php或任何git跟踪的文件中
  • 不要更改它,除非您真的想要
    • 使会话/cookie无效(用户注销)
    • 使密码重置令牌无效
    • 使签名URL无效

注意:更改应用程序密钥对哈希密码没有影响,因为哈希算法不需要加密密钥。


非常详细的答案 - Shobi
1
谢谢你的明显提示。对我来说并不明显。 - senecaTheMeek
@senecaTheMeek,我修改了措辞,不再包含“显而易见”。谢谢。 - Kyslik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接