它被用于 EncryptionServiceProvider
中:
public function register()
{
$this->app->singleton('encrypter', function ($app) {
$config = $app->make('config')->get('app');
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(iv
,value
,mac
),您需要了解AES:
应用密钥的良好实践
- 要仅将其存储在
.env
文件中
- 不要将其存储在
app.php
或任何git跟踪的文件中
- 不要更改它,除非您真的想要
- 使会话/cookie无效(用户注销)
- 使密码重置令牌无效
- 使签名URL无效
注意:更改应用程序密钥对哈希密码没有影响,因为哈希算法不需要加密密钥。
config/app.php
中:此密钥由 Illuminate 加密服务使用... - Kyslik