yii2的使用者登入hash及其驗證分析

2021-07-02 12:13:35 字數 2055 閱讀 2883

使用gii生成使用者表的model生成的幾個方法解析:

隨機數生成

protected function generatesalt($cost = 13)

$rand = $this->generaterandomkey(20);

$salt = sprintf("$2y$%02d$", $cost);

$salt .= str_replace('+', '.', substr(base64_encode($rand), 0, 22));

return $salt;

}

(1)、生成隨機數:$rand = $this->generaterandomkey(20);

(2)、加上字首:$salt = sprintf("$2y$%02d$", $cost);   $cost=13時預設字首為$2y$13$

(3)、將$rand用base64加密,取前22位,並將+替換為.,最後加上字首返回

原理,使用blowfish標準加密生成60個字元的hash,利用salt的最大長度(個人理解,salt最大長度應該是在21到22個字元之間),將hash作為salt與明文密碼加密可得出一樣的結果;密碼最大為74個字元,超出則與74個字元密文相同;

setpassword()方法:

2、validatepassword($password)的方法

該方法會呼叫yii2/base/security的validpassword()方法,

security中的validpassword()方法會將使用者輸入的密碼與資料庫中的hash值一起加密

$test = crypt($password, $hash);

$n = strlen($test);

if ($n !== 60)

return $this->comparestring($test, $hash);

然後返回comparestring($test, $hash)方法的結果

comparestring方法:

//加上結束標記,防止mb_strlen()函式找不到結束標記

$expected .= "\0";

$actual .= "\0";

//呼叫mb_strlen($string, '8bit')函式按位獲取字串長度

$expectedlength = stringhelper::bytelength($expected);

$actuallength = stringhelper::bytelength($actual);

//獲得長度差值

$diff = $expectedlength - $actuallength;

//迴圈對比每一位的ascii值是否相等(先將密文hash與使用者輸入加密後的字串按位與,然後與diff按位或,返回結果)

for ($i = 0; $i < $actuallength; $i++)

return $diff === 0;

ord():

回字串第乙個字元的 ascii 值

crypt(str,salt):

str:必需。規定要編碼的字串。

salt:可選。用於增加被編碼字元數目的字串,以使編碼更加安全。如果未提供 salt 引數,則每次呼叫該函式時會隨機生成乙個。

mb_strlen():

獲取字串的長度,第二個引數為字元編碼。如果省略,則使用內部字元編碼。

$a | $b     or(按位或)     將把 $a 和 $b 中任何乙個為 1 的位設為 1。

$a ^ $b     xor(按位異或)     將把 $a 和 $b 中乙個為 1 另乙個為 0 的位設為 1。

~ $a     not(按位取反)     將 $a 中為 0 的位設為 1,反之亦然。

$a << $b     shift left(左移)     將 $a 中的位向左移動 $b 次(每一次移動都表示「乘以 2」)。

$a >> $b     shift right(右移)     將 $a 中的位向右移動 $b 次(每一次移動都表示「除以 2」)。

Yii 2 登入使用者校驗

在登入頁面,輸入使用者名稱密碼後,yii2是如何完成使用者名稱和密碼的校驗的?根據yii的規則,使用者校驗的入口是從action開始的 sitecontroller actionlogin loginform login loginform validate loginform validatepa...

yii2登入筆記

yii2高階模板中自帶了登入註冊功能,這裡先記下登入功能的實現筆記 建立一張使用者user表,裡面需要根據user 的model檔案進行更改一些欄位名和新增,password hash是指用yii2進行雜湊加密後的密碼串。auth key使用使用者註冊時加的唯一標示,可以用來在瀏覽器記住使用者登入有...

yii2實戰之使用者註冊登入

繼控制器與檢視互動,本篇將講解如何自定義全域性函式,以及使用yii自帶的使用者註冊登入功能 有時候我們希望自定義一些函式,可以在全域性中呼叫,如php預設的var dump在頁面上的顯示效果並不好,尤其是多層級陣列的情況下,一大坨資料很難分辨。對此,yii提供了vardumper助手,可以輸出美觀易...