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的value值却一直没有变。