為什么要在密碼里加點(diǎn)“鹽”
所謂加鹽(Salt)方法俯萎,就是加點(diǎn)“佐料”向臀。讓密碼破解起來(lái)更加困難犯建;
鹽(Salt)
在密碼學(xué)中,是指通過(guò)在密碼任意固定位置插入特定的字符串先鱼,讓散列后的結(jié)果和使用原始密碼的散列結(jié)果不相符俭正,這種過(guò)程稱之為“加鹽”。
以上這句話是維基百科上對(duì)于 Salt 的定義
如何在密碼里加鹽
現(xiàn)在很少系統(tǒng)會(huì)直接明文保存用戶的密碼了焙畔,至少也是會(huì)計(jì)算密碼的 md5 后保存掸读。md5 這種不可逆的加密方法理論上已經(jīng)很安全了,但是隨著彩虹表的出現(xiàn)宏多,使得大量長(zhǎng)度不夠的密碼可以直接從彩虹表里反推出來(lái)儿惫。百度一下一堆md5解密的網(wǎng)站。只對(duì)密碼進(jìn)行 md5 加密是肯定不夠的伸但,所以要原來(lái)密碼的基礎(chǔ)上“加鹽”肾请。
鹽(salt)可以是任意字母、數(shù)字更胖、或是字母或數(shù)字的組合铛铁,但必須是隨機(jī)產(chǎn)生的隔显,每個(gè)用戶的 Salt 都不一樣
/**
* 獲取隨機(jī)字符串
* length 代表返回字符串的長(zhǎng)度
*/
function getRandStr($length){
$str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890';
$randStr = str_shuffle($str);
$rands= substr($randStr,0,$length);
return $rands;
}
計(jì)算方式比如:
md5(md5(password)+md5(salt))
各種形式隨意組合,只要登錄驗(yàn)證時(shí)對(duì)應(yīng)即可饵逐。
mysql數(shù)據(jù)庫(kù)存儲(chǔ)字段
password:根據(jù)計(jì)算公式計(jì)算的值md5(md5(password)+md5(salt))
salt:隨機(jī)字符串(getRandStr(8))
登錄驗(yàn)證時(shí)
將獲取的用戶輸入的登錄密碼根據(jù)對(duì)應(yīng)的計(jì)算公式計(jì)算md5值與數(shù)據(jù)庫(kù)中password進(jìn)行比對(duì)