laravel 中cookie加密中间件

laravel中cookie的值总是变的原因解析

router中的web默认注册了一个加密中间件
vendor/laravel/framework/src/Illuminate/Encryption/Encrypter.php
该类中的加密方法

public function encrypt($value, $serialize = true)
    {
    	//此处的this->cipher是在config的app.php注册的加密方法,默认是AES-256-CBC,openssl_cipher_iv_length根据加密算法获取算法的iv变量长度,random_bytes随机生成该长度的字符串ascii编码
        $iv = random_bytes(openssl_cipher_iv_length($this->cipher));

        //根据value,算法,iv变量和this->key使用openssl生成加密的value,this->key是在config的app.php中配置的key,默认是.env文件中的APP_KEY
        $value = \openssl_encrypt(
            $serialize ? serialize($value) : $value,
            $this->cipher, $this->key, 0, $iv
        );

        if ($value === false) {
            throw new EncryptException('Could not encrypt the data.');
        }
		
		//根据iv变量和value值生成hash值进行签名校验
        $mac = $this->hash($iv = base64_encode($iv), $value);

      	//将iv,value,mac组成json字符串
        $json = json_encode(compact('iv', 'value', 'mac'));

        if (json_last_error() !== JSON_ERROR_NONE) {
            throw new EncryptException('Could not encrypt the data.');
        }
        //将上面的json字符串进行base64编码,由于每次iv变量随机生成的不一样所以编码之后的字符串一直都会变
        return base64_encode($json);
    }

2.该类中的解密算法

public function decrypt($payload, $unserialize = true)
    {
     //根据加密的字符串解析出来,iv,value,mac,在
     //getJsonPayload方法中校验了有没有这三个变量,
     //并且iv变量的长度,以及mac是否正确
        $payload = $this->getJsonPayload($payload);

		//playload中的iv是base64编码的字符串,解析出来原来的asscii字符串
        $iv = base64_decode($payload['iv']);

		//根据openssl加密之后的value,算法,key,iv变量解析出来原来的cookie值
        $decrypted = \openssl_decrypt(
            $payload['value'], $this->cipher, $this->key, 0, $iv
        );

        if ($decrypted === false) {
            throw new DecryptException('Could not decrypt the data.');
        }
        //返回原来的cookie值
        return $unserialize ? unserialize($decrypted) : $decrypted;
    }
    

3.总结
虽然每次laravel中cookie值都会变,但是服务端解析到的cookie值却一直没有变。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值