1. 程式人生 > >Yii2框架之Cookie加密篇

Yii2框架之Cookie加密篇

cookie在傳送到客戶端之前如果不經任何加密,會很容易被偽造,下面我們來簡單介紹下Yii2框架是怎麼對cookie進行加密的。

$cookie = new yii\web\Cookie([
    'name' => 'username',
    'value' => 'test',
]);
Yii::$app->response->getCookies()->add($cookie);

首先,我們new一個新的Cookie物件

$serial = serialize([$cookie->name, $cookie->value]);

接著,Yii2會把$cookie物件按照上面的方式進行序列化

$value = Yii::$app->getSecurity()->hashData($serial, $validationKey);

接著,Yii2會把序列化好之後的$serial做一次雜湊,其中,$validateionKey是用來做雜湊的key,在配置檔案中可以設定。hashData()這個方法會把生成的雜湊值$hash$serial拼接起來,然後返回。生成雜湊值的方法使用了hash_hmac()這個函式,根據不同的雜湊演算法,雜湊值的長度可能會不一樣,比如預設的sha256演算法就是64位的,我們可以根據這個原理將$hash$serial拆開,然後來驗證cookie的合法性。

最後,上面的$value將會作為cookie的新值傳送給客戶端。

知道了cookie是怎麼加密的,那麼也很容易知道怎麼去驗證cookie的合法性了,由於cookie加密後的值是由$hash$serial直接拼接而成的,那麼我們只要根據“不同演算法生成的雜湊值長度不一樣”這個原理,把$hash$serial提取出來,然後使用相同的$validationKey$serial做雜湊,然後和$hash的值作比較看是否相等,如果相等的話,那麼就證明這個cookie是合法的了。