1. 程式人生 > >laravel cookie加密解密原理

laravel cookie加密解密原理

log function open 字符串 random 了解 是我 var 沒有

通過控制臺的 cookie 信息我們會發現,每次請求之後,關鍵的 cookie,如PHPSESSID、XSRF-TOKEN 都會發生變化,並且都是很長的一串字符串。

其實這是一個 json 數組,其中包含了 iv,value,mac 三個字段:

技術分享圖片

這些字段都是在框架加密解密的時候使用的,加密方法是 openssl_encrypt:

技術分享圖片

對 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。

這樣看來,mac 字段似乎有點多余,但是我們可以使用該字段來驗證數據的合法性:

技術分享圖片

如果驗證不通過, laravel 也就不會對 data 進行解密操作。

雖然每次請求 cookie 都會發生變化,但是實際數據是沒有變的,發生變化只是因為用來加密的 iv 變了(使用 random_bytes 方法生成)。

由於 iv 每次都變化,所以需要把 iv 也一同返回給瀏覽器,加上驗證數據合法性的 mac,最後返回的就是下面的數組的 json編碼後在 base64 編碼的數據:

[
   ‘iv‘ => random_bytes(16), // 16位隨機字節串
   ‘value‘ => ‘xxxx...‘,    // 加密後的數據
   ‘mac‘ => ‘xxx...‘   // 後續請求驗證數據合法性的字符串
]

  

laravel cookie加密解密原理