為什麼在建用戶表的時候一般都會加個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()
和
===操作符和
strcmp()
和
操作符和
strcmp()
和
===
操作符和
strcmp()
但是
password_verify()
可以幫你完成這項工作.
所以我們鼓勵你盡可能的使用原生密碼散列API.
加解密領域中的"鹽"是指在進行散列處理的過程中加入的一些數據,
用來避免從已計算的散列值表(被稱作"彩虹表")中對比輸出數據從而取得明文密碼的風險.
簡單而言,"鹽"就是為了提高散列值被破解的難度而加入的少量數據.
透過加"鹽"就可以避免直接從清單中查找到對應明文的風險.
彩虹表是一個用於加密散列函數逆運算的預先計算好的表,常用於破解加密過的密碼雜湊.
當使用password_hash()或者crypt()函數時,"鹽"會被作為生成的散列值的一部分返回.
你可以直接把完整的返回值存儲到資料庫中,因為這個回傳值中已經包含了足夠的資訊.
可以直接用在password_verify()或crypt()函數來進行密碼驗證.🎜 🎜鹽還有個用處就是可以用來做識別用戶身份的cookie,🎜比如基於數據庫實現一套自定義的cookie會話機制:🎜這個cookie既要做到認證用戶,又要做到不能被偽造和破解.🎜<code>//保护用户密码的盐 $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;</code>🎜 🎜用 bcrypt 吧,PHP 5.5.0 預設演算法了都。 🎜咋還 md5 呢? 🎜 🎜 🎜http://zhuanlan.zhihu.com/p/2...🎜