為什麼在建使用者表的時候一般都會加個salt欄位,然後計算password的時候,會根據註冊頁面輸入的密碼和隨機產生的salt值一起做MD5加密,這樣做有什麼好處啊,大神們給個詳細的解釋。
回複內容:
為什麼在建使用者表的時候一般都會加個salt欄位,然後計算password的時候,會根據註冊頁面輸入的密碼和隨機產生的salt值一起做MD5加密,這樣做有什麼好處啊,大神們給個詳細的解釋。
經過MD5加密的弱密碼仍然可以通過窮舉或彩虹表破解,加鹽是為了增加MD5破解難度從而提高安全性。
主要是為了避免資料庫被竊取後,直接擷取使用者的密碼明文.
PHP密碼散列安全
密碼散列相關函數:
password_hash(推薦) crypt(blowfish) hash sha1 md5
hash函數支援多種雜湊演算法hash_algos,比如sha512.
PHP 5.5開始提供了一個原生密碼散列API(password_hash/password_verify),
它提供一種安全的方式來完成密碼散列和驗證.
PHP 5.3.7及後續版本中提供了一個純PHP的原生密碼散列API的相容庫.
當PHP版本不支援password_hash/password_verify時,改用crypt實現.
如果使用crypt()函數來進行密碼驗證,那麼你需要選擇一種耗時恒定的字串比較演算法來避免時序攻擊.
耗時恒定就是字串比較所消耗的時間恒定,不隨輸入資料的多少變化而變化.
PHP中的==和===操作符和strcmp()函數都不是耗時恒定的字串比較,
但是password_verify()可以幫你完成這項工作.
所以我們鼓勵你儘可能的使用原生密碼散列API.
加解密領域中的"鹽"是指在進行散列處理的過程中加入的一些資料,
用來避免從已計算的散列值表(被稱作"彩虹表")中對比輸出資料從而擷取純文字密碼的風險.
簡單而言,"鹽"就是為了提高散列值被破解的難度而加入的少量資料.
現在有很多線上服務都能夠提供計算後的散列值以及其對應的原始輸入的清單,並且資料量極其龐大.
通過加"鹽"就可以避免直接從清單中尋找到對應明文的風險.
彩虹表是一個用於加密散列函數逆運算的預先計算好的表,常用於破解加密過的密碼散列.
password_hash()函數會隨機產生"鹽".
當使用password_hash()或者crypt()函數時,"鹽"會被作為產生的散列值的一部分返回.
你可以直接把完整的傳回值儲存到資料庫中,因為這個傳回值中已經包含了足夠的資訊.
可以直接用在password_verify()或crypt()函數來進行密碼驗證.
鹽還有個用處就是可以用來做識別使用者身份的cookie,
比如基於資料庫實現一套自訂的cookie會話機制:
這個cookie既要做到認證使用者,又要做到不能被偽造和破解.
//保護使用者密碼的鹽$salt = sha1( uniqid(getmypid().'_'.mt_rand().'_', true) );//資料庫儲存的使用者密碼($pwd_user是使用者輸入的密碼明文)$pwd_db = sha1($salt.sha1($pwd_user));//cookie裡的鹽//其中$global_salt是配置裡定義的全域鹽,用來保護使用者的鹽,一旦修改,所有使用者的cookie都將失效.$cookie_salt = sha1($global_salt.sha1($salt));//最終產生的cookie內容$cookie = base64_encode($user_id.'|'.$cookie_salt);//如果你需要高安全性,還可以使用MCRYPT_BLOWFISH對整個cookie的內容做一次加密.$cookie = mcrypt_blowfish($cookie, $key);//設定cookie,這裡把到期時間設為604800秒(60*60*24*7,一周)setcookie('sessid', $cookie, time()+604800, '/', '', false, true);//解密cookie$cookie = mdecrypt_blowfish($_COOKIE['sessid'], $key);//解碼分割後拿到裡面的$user_id和$cookie_salt$cookie = explode('|', base64_decode($_COOKIE['sessid']));list($user_id, $cookie_salt) = $cookie;
用 bcrypt 吧,PHP 5.5.0 預設演算法了都。
咋還 md5 呢?
http://zhuanlan.zhihu.com/p/2...