laravel cookie加密解密原理

经过控制台的 cookie 信息咱们会发现,每次请求以后,关键的 cookie,如PHPSESSID、XSRF-TOKEN 都会发生变化,而且都是很长的一串字符串。php

其实这是一个 json 数组,其中包含了 iv,value,mac 三个字段:laravel

 

这些字段都是在框架加密解密的时候使用的,加密方法是 openssl_encryptjson

 

对 openssl 不太了解的能够看下下面的例子:数组

$data = 'laravel';
$iv = random_bytes(16);
$key = 'this is key';

$encrypt = openssl_encrypt($data, 'AES-256-CBC', $key, 0, $iv);

var_dump($encrypt);
var_dump(openssl_decrypt($encrypt, 'AES-256-CBC', $key, 0, $iv));

 

laravel 中的话,key 就是 .env 配置文件里面的 APP_KEY,除了 key 还有两个变化的参数就是 加密、解密的数据以及 iv。浏览器

也就是说,若是咱们须要加密 cookie 的话,咱们至少得保存下 加密后的数据以及 iv。cookie

这样看来,mac 字段彷佛有点多余,可是咱们能够使用该字段来验证数据的合法性:框架

若是验证不经过, laravel 也就不会对 data 进行解密操做。dom

 

虽然每次请求 cookie 都会发生变化,可是实际数据是没有变的,发生变化只是由于用来加密的 iv 变了(使用 random_bytes 方法生成)。this

因为 iv 每次都变化,因此须要把 iv 也一同返回给浏览器,加上验证数据合法性的 mac,最后返回的就是下面的数组的 json编码后在 base64 编码的数据:编码

[
   'iv' => random_bytes(16), // 16位随机字节串
   'value' => 'xxxx...',    // 加密后的数据
   'mac' => 'xxx...'   // 后续请求验证数据合法性的字符串
]
相关文章
相关标签/搜索