2012-07-05 50 views
2

我創建一個用戶登錄的功能,但我已經看到了這樣做的最佳方式看法不一。散列(與鹽)的用戶名和密碼在PHP

這裏就是我想這樣做的......

  • 使用哈希是基於對 用戶名子2種散列鹽的用戶名。
  • 使用2個隨機生成的散列鹽進行密碼散列,這些散列鹽通過密碼和用戶名保存在 表中。

這是矯枉過正,錯誤,甚至不夠安全?

+1

重塑車輪或重新使用其他代碼http://www.openwall.com/phpass/ – 2012-07-05 15:22:25

+0

請接受@ImreL的建議。使用像phppass或[PasswordLib](https://github.com/ircmaxell/PHP-PasswordLib)這樣的庫來生成** strong **散列。 – Leigh 2012-07-05 15:39:59

+0

重新發明輪子或重新發布其他代碼#2 http://php-login.net – Sliq 2012-07-09 12:54:50

回答

4

鹽漬防止彩虹桌,所以有2鹽不會比1更好。黑客需要知道鹽,以便用彩虹桌破解你的密碼,他們可以做到這一點的唯一方法是否他們有權訪問數據庫表。如果他們有,他們無論如何都有鹽。

密碼越長,用強力操作就越困難,所以密碼長度要比額外的鹽好。

每次從數據庫中讀取用戶名時,對用戶名進行醃製和哈希處理會增加不必要的開銷。使用密碼只需登錄即可使用密碼和散列。

理想情況下使用類似BCrypt的東西,其中隨着時間的推移,密碼散列函數可以自適應地減慢,因爲moore's law繼續。這將減少暴力攻擊的可能性。

2

我想說的是哈希的用戶名是矯枉過正,因爲是密碼兩種鹽。一鹽就足夠了。

確保使用安全散列算法,如SHA-512。

+0

好的,所以我認爲我已經制定出每個人都說它過度殺傷,但我認爲它沒有錯或不太安全。 – Tom 2012-07-05 15:25:58

+0

確實。這更多的是開銷,沒有增加不安全感。 – Rawkode 2012-07-05 15:27:22

+0

建議使用像bcrypt這樣的慢哈希函數,即使它們在技術上是安全的,也可以使用其他哈希函數來強制方式太快。 – martinstoeckli 2012-07-05 16:02:03

1

與其他人一樣說,散列的用戶名是矯枉過正和一個鹽就足夠了。使用算法運算速度慢 - 對於黑客來說也會很慢。

0

我剛剛回答了another SO question詳細介紹瞭如何處理登錄和密碼安全性。這可能值得一讀。 (一些小技巧:用戶名不需要被鹽漬,密碼絕對應該是鹽漬的,但是一次就是你所需要的,我使用SHA-256。)

+0

您的長篇帖子並未提及密鑰衍生函數及其對密碼哈希的好處。 – Leigh 2012-07-05 15:37:08

+0

感謝您指出KDF的。這對我來說是新的。隨意評論更多! – curtisdf 2012-07-05 18:50:04

1

醃製你的密碼一次就足夠了。具有兩種鹽基本上相當於產生較長的鹽。

散列用戶名會讓你更難管理你的用戶,而不是使登錄更安全。考慮製作一個你當前用戶的列表,但你擁有的是散列版本?請記住,散列的重點是對數據進行不可逆的「加密」。

考慮使用crypt()來散列您的密碼。尤其要注意Blowfish方法,因爲這被認爲是目前最安全的哈希方法。

0

確實沒有必要散列您的用戶名字段,這應該是您願意在網頁上顯示的內容,同時保持系統安全。這就是說,雖然沒有必要,但如果你願意忍受它,它也不會受到傷害。

添加兩種鹽是相當無意義的,如果它們都來自並存儲在同一個地方。而不是這樣做,我會使用用戶名作爲鹽的排列,以及隨機生成並存儲在數據庫中的隨機長字符串。如果你仍然偏執狂,(我猜想你是整個「散列用戶名」的東西),我會考慮添加你在整個應用程序中使用的第三個鹽。

另外,非常重要的:

確保您使用一個強大的Hash函數

確保您使用的是安全散列函數。漩渦,sha256及以上,老虎,或其他任何你可以使用的東西(檢查hash_algos())。另外,看看實施bcrypt,這是非常緩慢的(How do you use bcrypt for hashing passwords in PHP?)。