您好,登錄后才能下訂單哦!
本篇文章為大家展示了使用yii2怎么實(shí)現(xiàn)加密解密,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
Security組件源代碼位置如下
vendor/yiisoft/yii2/base/Security.php
Security組件一共有15個與加密解密(&編碼)相關(guān)的公共方法,我們先來列一個清單。
encryptByPassword
encryptByKey
decryptByPassword
decryptByKey
hkdf
pbkdf2
hashData
validateData
generateRandomKey
generateRandomString
generatePasswordHash
validatePassword
compareString
maskToken
unmaskToken
我想有一些你一定沒見過,沒關(guān)系,我們一一去了解。
generateRandomString
之所以先說generateRandomString是因?yàn)樗畛S?,起碼我是這樣。
public function generateRandomString($length = 32){...}
生成一個隨機(jī)的字符串,參數(shù)$length代表這個字符串的長度,默認(rèn)32位。值得說明的是這個字符串的取值為范圍是[A-Za-z0-9_-]。
generatePasswordHash & validatePassword
generatePasswordHash & validatePassword經(jīng)常被用來加密用戶密碼以及對密碼是否正確的驗(yàn)證,自從MD5可能被碰撞后,我們用yii2開發(fā)應(yīng)用的時候,generatePasswordHash函數(shù)對密碼進(jìn)行加密就成為首選了,它調(diào)用了crypt函數(shù)。
一般用法如下
// 使用generatePasswordHash為用戶的密碼加密,$hash存儲到庫中 $hash = Yii::$app->getSecurity()->generatePasswordHash($password); // 使用validatePassword對密碼進(jìn)行驗(yàn)證 if(Yii::$app->getSecurity()->validatePassword($password, $hash)){ // 密碼正確 }else{ // 密碼錯誤 }
generateRandomKey
和generateRandomString類似,生成一個隨機(jī)的串,參數(shù)為長度,默認(rèn)為32位,區(qū)別在于generateRandomKey生成的不是ASCII。
簡單的說 generateRandomString 約等于 base64_encode(generateRandomKey)。
encryptByPassword & decryptByPassword
編碼和解碼函數(shù),使用一個秘鑰對數(shù)據(jù)進(jìn)行編碼,然后通過此秘鑰在對編碼后的數(shù)據(jù)進(jìn)行解碼。
例子
$dat = Yii::$app->security->encryptByPassword("hello","3166886"); echo Yii::$app->security->encryptByPassword($dat,"3166886");// hello
要注意,通過上面得到的編碼后的數(shù)據(jù)不是ASCII,可以通過base64_encode和base64_decode在外層包裝下。
encryptByKey & decryptByKey
同樣是一組編碼和解碼函數(shù),比通過密碼的方式要快。函數(shù)聲明為
public function encryptByKey($data, $inputKey, $info = null){} public function decryptByKey($data, $inputKey, $info = null){}
encryptByKey & decryptByKey 存在著第三個參數(shù),比如我們可以傳遞會員的ID等,這樣此信息將和$inputKey一起作為加密解密的鑰匙。
hkdf
使用標(biāo)準(zhǔn)的 HKDF 算法從給定的輸入鍵中導(dǎo)出一個鍵。在PHP7+使用的是hash_hkdf方法,小于PHP7使用hash_hmac方法。
pbkdf2
使用標(biāo)準(zhǔn)的 PBKDF2 算法從給定的密碼導(dǎo)出一個密鑰。該方法可以用來進(jìn)行密碼加密,不過yii2有更好的密碼加密方案 generatePasswordHash。
hashData和validateData
有的時候?yàn)榱朔乐箖?nèi)容被篡改,我們需要對數(shù)據(jù)進(jìn)行一些標(biāo)記,hashData和validateData就是完成這個任務(wù)的組合。
hashData 用來對原始數(shù)據(jù)進(jìn)行加數(shù)據(jù)前綴,比如如下代碼
$result = Yii::$app->security->hashData("hello",'123456',false); // ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello
你看到了在hello的前面多了一組字符,這組字符會隨著原始數(shù)據(jù)的不同而變化。這樣我們就對數(shù)據(jù)進(jìn)行了特殊的防止篡改標(biāo)記,接下來是validateData上場了。
注意:hashData的第三個參數(shù)代表生成的哈希值是否為原始二進(jìn)制格式. 如果為false, 則會生成小寫十六進(jìn)制數(shù)字.
validateData 對已經(jīng)加了數(shù)據(jù)前綴的數(shù)據(jù)進(jìn)行檢測,如下代碼
$result = Yii::$app->security->validateData("ac28d602c767424d0c809edebf73828bed5ce99ce1556f4df8e223faeec60eddhello",'123456',false); // hello
如果返回了原始的字符串則表示驗(yàn)證通過,否則會返回假。
validateData 函數(shù)的第三個參數(shù)應(yīng)該與使用 hashData() 生成數(shù)據(jù)時的值相同. 它指示數(shù)據(jù)中的散列值是否是二進(jìn)制格式. 如果為false, 則表示散列值僅由小寫十六進(jìn)制數(shù)字組成. 將生成十六進(jìn)制數(shù)字.
compareString
可防止時序攻擊的字符串比較,用法非常簡單。
Yii::$app->security->compareString("abc",'abc');
結(jié)果為真則相等,否則不相等。
那么什么是時序攻擊那?我來舉一個簡單的例子。
if($code == Yii::$app->request->get('code')){ }
上面的比較邏輯,兩個字符串是從第一位開始逐一進(jìn)行比較的,發(fā)現(xiàn)不同就立即返回 false,那么通過計算返回的速度就知道了大概是哪一位開始不同的,這樣就實(shí)現(xiàn)了電影中經(jīng)常出現(xiàn)的按位破解密碼的場景。
而使用 compareString 比較兩個字符串,無論字符串是否相等,函數(shù)的時間消耗是恒定的,這樣可以有效的防止時序攻擊。
maskToken && unmaskToken
maskToken用于掩蓋真實(shí)token且不可以壓縮,同一個token最后生成了不同的隨機(jī)令牌,在yii2的csrf功能上就使用了maskToken,原理并不復(fù)雜,我們看下源碼。
public function maskToken($token){ $mask = $this->generateRandomKey(StringHelper::byteLength($token)); return StringHelper::base64UrlEncode($mask . ($mask ^ $token)); }
而unmaskToken目的也很明確,用于得到被maskToken掩蓋的token。
接下來我們看一個例子代碼
$token = Yii::$app->security->maskToken("123456"); echo Yii::$app->security->unmaskToken($token);// 結(jié)果為 123456
上述內(nèi)容就是使用yii2怎么實(shí)現(xiàn)加密解密,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。