深入密碼加salt原理的分析
我們知道,如果直接對(duì)密碼進(jìn)行散列,那么黑客可以對(duì)通過(guò)獲得這個(gè)密碼散列值,然后通過(guò)查散列值字典(例如MD5密碼破解網(wǎng)站),得到某用戶的密碼。
加Salt可以一定程度上解決這一問(wèn)題。所謂加Salt方法,就是加點(diǎn)“佐料”。其基本想法是這樣的:當(dāng)用戶首次提供密碼時(shí)(通常是注冊(cè)時(shí)),由系統(tǒng)自動(dòng)往這個(gè)密碼里撒一些“佐料”,然后再散列。而當(dāng)用戶登錄時(shí),系統(tǒng)為用戶提供的代碼撒上同樣的“佐料”,然后散列,再比較散列值,已確定密碼是否正確。
這里的“佐料”被稱作“Salt值”,這個(gè)值是由系統(tǒng)隨機(jī)生成的,并且只有系統(tǒng)知道。這樣,即便兩個(gè)用戶使用了同一個(gè)密碼,由于系統(tǒng)為它們生成的salt值不同,他們的散列值也是不同的。即便黑客可以通過(guò)自己的密碼和自己生成的散列值來(lái)找具有特定密碼的用戶,但這個(gè)幾率太小了(密碼和salt值都得和黑客使用的一樣才行)。
下面以PHP示例,講解md5($pass.$salt)加密函數(shù)。
<?php
function hash($a) {
$salt=”Random_KUGBJVY”; //定義一個(gè)salt值,程序員規(guī)定下來(lái)的隨機(jī)字符串
$b=$a.$salt; //把密碼和salt連接
$b=md5($b); //執(zhí)行MD5散列
return $b; //返回散列
}
?>
調(diào)用方式:$new_password=hash($_POST[password]); //這里接受表單提交值,并進(jìn)行加密
下面詳細(xì)介紹一下加Salt散列的過(guò)程。介紹之前先強(qiáng)調(diào)一點(diǎn),前面說(shuō)過(guò),驗(yàn)證密碼時(shí)要使用和最初散列密碼時(shí)使用“相同的”佐料。所以Salt值是要存放在數(shù)據(jù)庫(kù)里的。
用戶注冊(cè)時(shí),
用戶輸入【賬號(hào)】和【密碼】(以及其他用戶信息);系統(tǒng)為用戶生成【Salt值】;系統(tǒng)將【Salt值】和【用戶密碼】連接到一起;對(duì)連接后的值進(jìn)行散列,得到【Hash值】;將【Hash值1】和【Salt值】分別放到數(shù)據(jù)庫(kù)中。
用戶登錄時(shí),
用戶輸入【賬號(hào)】和【密碼】;系統(tǒng)通過(guò)用戶名找到與之對(duì)應(yīng)的【Hash值】和【Salt值】;系統(tǒng)將【Salt值】和【用戶輸入的密碼】連接到一起;對(duì)連接后的值進(jìn)行散列,得到【Hash值2】(注意是即時(shí)運(yùn)算出來(lái)的值);比較【Hash值1】和【Hash值2】是否相等,相等則表示密碼正確,否則表示密碼錯(cuò)誤。
有時(shí)候,為了減輕開發(fā)壓力,程序員會(huì)統(tǒng)一使用一個(gè)salt值(儲(chǔ)存在某個(gè)地方),而不是每個(gè)用戶都生成私有的salt值。
相關(guān)文章
PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹
這篇文章主要介紹了PHP并發(fā)多進(jìn)程處理利器Gearman使用介紹,需要的朋友可以參考下2016-05-05php實(shí)現(xiàn)圖片上傳并利用ImageMagick生成縮略圖
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)圖片上傳并利用ImageMagick生成縮略圖的相關(guān)資料,需要的朋友可以參考下2016-03-03php 無(wú)極分類(遞歸)實(shí)現(xiàn)代碼
php 無(wú)極分類(遞歸)實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-01-01PHP實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)二維數(shù)組的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)一維數(shù)組轉(zhuǎn)二維數(shù)組的方法,實(shí)例分析了php操作數(shù)組的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02PHP7擴(kuò)展開發(fā)之基于函數(shù)方式使用lib庫(kù)的方法詳解
這篇文章主要介紹了PHP7擴(kuò)展開發(fā)之基于函數(shù)方式使用lib庫(kù)的方法,結(jié)合實(shí)例形式分析了PHP7中l(wèi)ib庫(kù)擴(kuò)展的封裝與調(diào)用相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Windows上PHP安裝redis擴(kuò)展和igbinary擴(kuò)展
php擴(kuò)展就是php核心并不支持的功能,通過(guò)安裝擴(kuò)展增加PHP的功能,在Windows上有兩種加載PHP擴(kuò)展的方式:把擴(kuò)展編譯進(jìn)?PHP,或者加載?DLL,加載預(yù)編譯的擴(kuò)展是更簡(jiǎn)單更被推薦的方式,要加載某擴(kuò)展,需要在系統(tǒng)中有其相對(duì)應(yīng)的“.dll”文件2023-10-10php保留數(shù)字小數(shù)點(diǎn)后兩位的方法
我們?cè)趯W(xué)習(xí)或生活中經(jīng)常會(huì)遇到需要保留數(shù)字小數(shù)點(diǎn)后兩位的問(wèn)題,所以本文小編給大家介紹了使用php保留數(shù)字小數(shù)點(diǎn)后兩位的方法,文中通過(guò)代碼示例介紹的非常詳細(xì),感興趣的同學(xué)可以參考閱讀下2023-12-12php版微信支付api.mch.weixin.qq.com域名解析慢原因與解決方法
這篇文章主要介紹了php版微信支付api.mch.weixin.qq.com域名解析慢原因與解決方法,詳細(xì)分析了微信支付api.mch.weixin.qq.com域名解析慢原因與使用curl_easy_setopt指定ipv4解決ipv6解析問(wèn)題的相關(guān)技巧,需要的朋友可以參考下2016-10-10