雖然PHP提供了散列和加密函數、字符串函數,咱們仍是有必要採起額外的安全措施以確保用戶的信息安全。給密碼加salt,也就是在對密碼進行散列計算時添加額外的字符串,是一種至關簡單有效地加強安全性的方法。html
salt是一個字符串,能夠事先定義好,也能夠隨機產生。在對用戶輸入數據進行散列時,就是用它給輸入數據加料。shell
若是不適用salt,會這樣對密碼進行散列:數據庫
$hash = sha1($password);
下面的代碼給上面這個散列運算加了點隨機的salt:安全
$salt = substr(mdt(time()), 0, 7); //建立隨機salt $hash = $salt. sha1($salt。$password);
上面的代碼生成了一個隨機的長度爲7的salt(字符串)。在散列前把salt做爲這個密碼的前綴,這意味着即便兩個用戶使用相同的密碼,散列後的密碼也不會相同。函數
爲了能夠從新得到這個散列值,咱們須要把這個salt保存起來備用。所以,salt再一次做爲前綴,計算得來的散列值的前綴,以未加密的方式保存到最終的散列值中。這樣,當一個用戶登陸時,你可以從數據庫中獲得散列後的密碼並從中獲取到salt,而後使用它從新生成加了salt的散列後的用戶密碼。加密
$salt = substr($dbhash, 0, 7); //釋放散列值中的salt $hash = $salt . sha1($salt. htmlentities($_POST['password'], ENT_QUOTES)); if($hash == $dbhash){ echo "success"; }else{ echo "NO match"; }
除此以外,還能夠經過增長檢查失敗登陸次數來加強安全性。那樣的話,攻擊者在屢次破解一個密碼時,會被系統鎖定,並且這個措施一樣能夠防止拒絕服務攻擊或那些發送巨量請求試圖讓站點因過載而死機的攻擊。spa
調置口令失敗的上限,若是失敗過多,則把賬號鎖了,須要用戶以找回口令的方式來從新激活賬號。可是,這個功能可能會被惡意人使用。最好的方法是,增長其嘗試的時間成本。如,兩次口令嘗試的間隔是5秒鐘。三次以上錯誤,賬號被臨時鎖上30秒,5次以上賬號被鎖1分鐘,10次以上錯誤賬號被鎖4小時……code
參考資料:htm
[book]: 深刻PHP與JQuery開發blog
[link]: 如何防範密碼被破解