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的,限于篇幅,这里不再做过多阐述,感兴趣的可以自行参考相关资料。

 

posted @ 2022-04-27 18:17  jamstack  阅读(1638)  评论(0编辑  收藏  举报