密碼加SALT原理

王明輝發表於2014-08-01

原來這個技術叫SALT,以前我們經常這麼用

====================================================================================

我們知道,如果直接對密碼進行雜湊,那麼黑客可以對通過獲得這個密碼雜湊值,然後通過查雜湊值字典(例如MD5密碼破解網站),得到某使用者的密碼。

 
  加Salt可以一定程度上解決這一問題。所謂加Salt方法,就是加點“佐料”。其基本想法是這樣的:當使用者首次提供密碼時(通常是註冊時),由系統自動往這個密碼裡撒一些“佐料”,然後再雜湊。而當使用者登入時,系統為使用者提供的程式碼撒上同樣的“佐料”,然後雜湊,再比較雜湊值,已確定密碼是否正確。
 
  這裡的“佐料”被稱作“Salt值”,這個值是由系統隨機生成的,並且只有系統知道。這樣,即便兩個使用者使用了同一個密碼,由於系統為它們生成的salt值不同,他們的雜湊值也是不同的。即便黑客可以通過自己的密碼和自己生成的雜湊值來找具有特定密碼的使用者,但這個機率太小了(密碼和salt值都得和黑客使用的一樣才行)。
 
下面以PHP示例,講解md5($pass.$salt)加密函式。
 
<?php
function hash($a) {
    $salt=”Random_KUGBJVY”;  //定義一個salt值,程式設計師規定下來的隨機字串
    $b=$a.$salt;  //把密碼和salt連線
    $b=md5($b);  //執行MD5雜湊
    return $b;  //返回雜湊    
}
?>
 
  呼叫方式:$new_password=hash($_POST[password]);   //這裡接受表單提交值,並進行加密
 
  下面詳細介紹一下加Salt雜湊的過程。介紹之前先強調一點,前面說過,驗證密碼時要使用和最初雜湊密碼時使用“相同的”佐料。所以Salt值是要存放在資料庫裡的。
 
使用者註冊時,
 
使用者輸入【賬號】和【密碼】(以及其他使用者資訊);系統為使用者生成【Salt值】;系統將【Salt值】和【使用者密碼】連線到一起;對連線後的值進行雜湊,得到【Hash值】;將【Hash值1】和【Salt值】分別放到資料庫中。
使用者登入時,
 
使用者輸入【賬號】和【密碼】;系統通過使用者名稱找到與之對應的【Hash值】和【Salt值】;系統將【Salt值】和【使用者輸入的密碼】連線到一起;對連線後的值進行雜湊,得到【Hash值2】(注意是即時運算出來的值);比較【Hash值1】和【Hash值2】是否相等,相等則表示密碼正確,否則表示密碼錯誤。
有時候,為了減輕開發壓力,程式設計師會統一使用一個salt值(儲存在某個地方),而不是每個使用者都生成私有的salt值。

相關文章