laravel cookie加密解密原理
阿新 • • 發佈:2018-01-11
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加密解密原理