都說md5不安全,貌似很多時候說是用sha1()進行加密更加安全,甚至還有用一種叫bcrypt的演算法,各位phper平時都是怎麼選擇的呢?
回複內容:
都說md5不安全,貌似很多時候說是用sha1()進行加密更加安全,甚至還有用一種叫bcrypt的演算法,各位phper平時都是怎麼選擇的呢?
題主你可以使用 md5 或者 sha1 進行初步處理,但為了更加安全,請你同時加上兩個 salt,一個靜態 salt,一個動態 salt。以 md5 為例:
假設通過 POST 傳來的密碼為 $_POST['password'],在存入 DB 前先進行如下的操作:
$password = hash('md5', $_POST['password'].$staticSalt.$dynamicSalt);
為了保證動態 salt 的唯一性,可以這樣操作:
$dynamicSalt = hash('md5', microtime());
對於動態 salt 可以與產生的密碼一起儲存在 DB 中,而靜態 salt 則可以直接放在類檔案中(例如定義為一個靜態屬性即可)。
首先謝謝題主採納了我的答案,但是我之前的回答並不是最佳答案,之所以有此加密的想法源於自己所讀的源碼可能比較老,所以並沒使用上較新版本的加密方法,例如 bcrypt等。
此外,第二點,感謝評論中幾位前輩的提點,已經明白設定靜態 salt 的意義並不大,產生一個較長的動態 salt 已然可以解決問題。
LZ應該採用加鹽HASH。
如何“醃制”密碼呢?
=_,=
正確的格式應該是,使用者password+動態salt
動態salt不能像2L所說的,使用microtime,因為時間在某些情況下不夠隨機,而且是可能被猜解的。
這裡推薦一個我用的加鹽HASH
$salt=base64_encode(mcrypt_create_iv(32,MCRYPT_DEV_RANDOM));$password=sha1($register_password.$salt);
解釋:
首先使用mcrypt,產生電腦隨機產生的,專門使用者加密的隨機數函數。
第二步,把得到的隨機數通過base64加密,使其變長並且不利於猜解。
第三步,把得出的鹽拼接到密碼的後面,再對其使用sha1進行雜湊
再把password存入到使用者的資料庫。
PS:為何不用靜態salt?沒有必要,使用一個動態隨機足夠長的鹽足矣。
為何不用MD5?因為長度不夠。
為何沒有使用多次HASH?因為這樣反而容易發生碰撞。
HASH好之後怎麼使用“醃制”好的密碼?
使用者註冊->提交密碼->產生salt->醃制好的密碼存入資料庫->salt存入資料庫。
使用者登入->提交密碼->調用salt接到提交密碼的後面->進行HASH->調用之前註冊醃制好的密碼->對比HASH值是否和這個密碼相同
最後推薦一篇文章,我是從中獲益的,希望LZ也有所收穫。
http://blog.jobbole.com/61872/
可以試試 phpass
對密碼進行雜湊相對安全的方法是使用bcrypt演算法。開源的phpass庫以一個便於使用的類來提供此功能。
這是我以前寫的一篇關於密碼加密的博文,歡迎參考。
http://www.wkii.org/save-user-password-use-bcrypt-or-pbkdf2.html
另外,請參考php5.5的內建函數
http://www.php.net/manual/zh/function.hash-pbkdf2.php
我寫的pbkdf2與php5.5的函數輸出結果一致。