laravel的APP_KEY的生成原理和作用
背景:
laravel的.env里有一项配置参数,叫APP_KEY,生成APP_KEY的命令,如下:
php artisan key:generate
这是用于给APP_KEY赋值的自定义command,定义在src/Illuminate/Foundation/Console/KeyGenerateCommand.php
那么,这个APP_KEY,是怎么生成的,又是干什么用的呢?
APP_KEY,全称:application key,php artisan key:generate 就是用来生成application key的,先来看KeyGenerateCommand.php的handle方法里APP_KEY的生成逻辑:
$key = $this->generateRandomKey();
再来看generateRandomKey方法的具体逻辑:
protected function generateRandomKey() { return 'base64:'.base64_encode( Encrypter::generateKey($this->laravel['config']['app.cipher']) ); }
上面的方法调用的是src/Illuminate/Encryption/Encrypter.php里的generateKey方法
public static function generateKey($cipher) { return random_bytes(self::$supportedCiphers[strtolower($cipher)]['size'] ?? 32); }
generateKey需要传入一个$cipher,$cipher具体是什么,由$this->laravel['config']['app.cipher']决定,也就是会读取config/app.php文件里的app.cipher对应的值,来确定使用的是哪个$cipher,在默认情况下,laravel的config/app.php里的app.cipher的值是aes-256-cbc
也就是说,APP_KEY,其实是由src/Illuminate/Encryption/Encrypter.php里的generateKey方法使用random_bytes根据$cipher的类型和长度生成的,由于laravel默认的$cipher = aes-256-cbc,对应的长度是32,因此,APP_KEY其本质上是由random_bytes方法随机返回的一个32位长的字符串,最后再由base64_encode进行加工,就形成了APP_KEY
protected function generateRandomKey() { return 'base64:'.base64_encode( Encrypter::generateKey($this->laravel['config']['app.cipher']) ); }
说完了APP_KEY的生成原理,再来看APP_KEY的作用,是用来干什么的?
在上面提到APP_KEY的生成原理时提到过,生成APP_KEY其实是调用Encrypter.php,从名字里不难看出,这是一个和加密有关的文件,而APP_KEY的作用,正是用来加密laravel生成的cookie的,限于篇幅,这里不再做过多阐述,感兴趣的可以自行参考相关资料。