1. 程式人生 > >MD5加鹽,實現一人一密

MD5加鹽,實現一人一密

理論上md5是不可逆的,而且MD5本來也不是作加密使用,而是用來校驗資料的完整性,只是因為其不可逆且穩定、快速的特點,被廣泛用於對明文密碼的加密。

至今仍然後很多開發人員相信MD5的保密性,也許因為他們知道MD5的演算法,覺得hash不可逆。但實際上,真正要破解MD5的人,不會選擇逆向逆的明文,都是用hash碰撞。把一些明文密碼MD5 hash一遍之後對比哪個MD5值與你的一樣。那你的明文就知道了。類似於一個比對詞典,叫做彩虹表。

舉個例子比如一個密碼是‘88888888’那麼任何採用標準MD5加密的網站資料庫中,存放的都是8ddcff3a80f4189ca1c9d4d902c3c909這樣一個MD5值。

由於密文相同,大多數網站和系統的加密都是以相同的明文口令生成相同的密文。所以,那些高頻的密文就是高頻明文的口令。攻擊者可以針對標準演算法來制定高頻明文的對應密文文件來查詢比對。通過窮舉的方式制定數字字母組合的口令與多種演算法加密結果的對映結果集,就形成了彩虹表。

加鹽

雜湊加鹽法(HASH+SALT)。所謂加鹽(SALT)其實就是生成HASH時給予一個干擾,使結果與標準的HASH結果不同,從而對抗彩虹表。 比如說使用者密碼‘88888888’,加一個鹽(一個隨機字串)‘q1we2rt3y6u8io7p’,拼接到一起在計算MD5,結果值就變了。這樣即使使用者使用弱密碼,也能一定程度上防禦彩虹攻擊。但是如果每個密碼加的鹽都是一樣的,那麼就又回到了之前的問題了。

一人一密

我們要實現,相同的站點,不同使用者的相同的密碼口令不同。這樣就能有效的對付碰撞和統計攻擊。例如:加自定義的鹽。密碼拼接使用者名稱或者時間戳在計算MD5。

PHP:

function hash($a) {
    $salt=”Random_KUGBJVY”;  //定義一個salt值,程式設計師規定下來的隨機字串
    $b=$a.$salt;  //把密碼和salt連線
    $b=md5($b);  //執行MD5雜湊
    return $b;  //返回雜湊    
}
使用者註冊時:
1.使用者輸入[username]和[password]
2.系統為使用者生成[Salt值]
3.系統將[Salt值]和[password]拼接在一起
4.對拼接後的值進行雜湊,得到[Hash1]
5.將[Hash1]和[Salt值]放在資料庫中。


使用者登入時:
1.使用者輸入[username]和[password]
2.系統通過使用者名稱找到與之對應的[Hash1]和[Salt值]
3.系統將[Salt值]和[使用者輸入的密碼]拼接在一起
4.對拼接後的值進行雜湊,得到[Hash2]
5.對比[Hash1]和[Hash2]是否相等,相等則授權登入

python:

uid = request.form['uid']#post請求引數
apikey = hashlib.md5(request.form['apikey']+request.form['uid']).hexdigest()
# password拼接username,因為username不會重複,從而實現不同使用者相同密碼的MD5不同