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...'   // 後續請求驗證數據合法性的字符串
]
相關文章
相關標籤/搜索