2012-10-04 143 views
24

可能重複:
Secure hash and salt for PHP passwords鹽和密碼

對於我的密碼,我應該使用的鹽是這樣的(鹽將是唯一的每個用戶,而不是與密碼直接存儲) ...

$salt = sha1(md5("coders gonna code")); 
$password = md5($salt.$password); 

,或者如果我只是用它會好起來的:

$password = md5($password); 

,因爲如果我使用的鹽,即使用戶如密碼拼成一個錯誤的密碼都不會有問題,因爲鹽(在這種情況下)將145ac26ff093c6e1317f7d5fb4c9fd11c77be975所以對於有密碼的條目將根據這是145ac26ff093c6e1317f7d5fb4c9fd11c77be975passwordhttp://howsecureismypassword.net/這將需要3個octodecillion年來破解....所以意見?或者我應該會更糟糕,去

$password = md5($salt.$password.md5($salt)); 

如果對方已經遠遠不夠,得到鹽哈希,將任何事情能夠阻止然後去futher? <更多一份聲明中的最後密碼


要大家誰說我應該做的每用戶...我知道,這僅僅是一個例子。

+0

對不起忘了編輯-.- – FabianCook

+4

你可以使用'PBKDF2'代替_salting_您的密碼。 – Florent

+0

閱讀本http://www.codinghorror.com/blog/2012/04/speed-hashing.html – jurgemaister

回答

13

您應該更改鹽,以便它對每個用戶都是特定的,而不是系統常量。這會讓彩虹表攻擊你的密碼更加不方便。

特洛伊亨特在這article鹽析的演變有一個很好的寫作。

編輯

$salt一些獨特的,以每個密碼的記錄,這增加了很多熵它。這通常是一個隨機的字節序列,與用戶帳戶一起存儲。

散列傳統上是在salt + password的串聯上完成的。

$passwordHash = hash($salt.$password); 

正如其他人所說的,不要使用MD5進行散列。它被打破。

散列之前,將額外的專有算法,密碼或鹽是not recommended。相反,看看一個行業優勢解決方案,如PBKDF2,除了醃製之外,還需要許多(通常> 10k)重複迭代,這將進一步減慢攻擊者的速度。

如果採用OWASP guidelines,進行哈希的數量應定期增加(以抵消摩爾定律)。散列的數量也應該保持爲每個用戶,這意味着您需要存儲散列密碼,salt和迭代次數的三倍。

+0

檢查編輯。謝謝,但我知道這一點。 :) – FabianCook

+2

我認爲這回答最好的問題,因爲對我來說,似乎OP不清楚知道爲什麼他應該用他的密碼鹽。 如果你使用固定鹽,那麼它是否需要30億年才能通過暴力破解密碼並不重要,因爲攻擊者只會查看你的數據庫表,看到有3000個密碼具有相同的散列值並猜測它可能是'密碼'或'12345'或其他。您使用動態哈希值,因此散列的和過時的密碼無法通過統計方式猜到。 –

13

您使用的鹽完全不正確。鹽應該是不可預測的;你的鹽是完全相反的(固定)。由於固定散列絕對沒有好處,因此它似乎也指望攻擊者不知道鹽。這是通過默默無聞的安全定義,這是另一個不好的做法。

你應該做的是:

  1. 使用合理長度的不可預知的字符串作爲鹽。從池中隨機生成8個字符的字符串,如小寫字母和數字都可以。
  2. 爲每個用戶使用不同的鹽,並在每次更改密碼時對其進行更改。
  3. 從MD5(被認爲中斷)移動到另一個更適合此應用程序的散列函數。 SHA-1更好,因爲它不會被破壞; bcrypt是最好的,因爲它具有可配置的加載因子。
+0

檢查編輯。謝謝,但我知道這一點。:) – FabianCook

+0

@SmartLemon:請編輯或刪除適當的問題的第一行。小編輯不足以讓我們知道你在做什麼。 – Jon

+0

那樣?我認爲它現在好了 – FabianCook

9
  1. 不要使用MD5爲您的哈希算法,使用的東西更安全,如SHA256甚至bcrypt

  2. 肯定鹽密碼,如果有人做才能進入到你的數據庫,他們將無法扭轉,共同哈希值或使用如虹的攻擊密碼。

http://michaelwright.me/php-password-storage

http://en.wikipedia.org/wiki/Bcrypt

+2

大家都認爲這是正確的?我想是這樣? – FabianCook

+1

Sha256仍然不是很安全仍然tbh,這裏也是一個工作版本的bcrypt完成正確的字節範圍鹽http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing- password-in-php – Sammaye

0

鹽是指完全隨機的,無關你是存儲的哈希實際的密碼。

你應該確實是產生一個完全隨機的鹽,然後做

$password = md5($salt.$password); 

並存儲用戶的用戶名,鹽和哈希密碼。

+1

不建議MD5,它不安全。 – 2012-10-04 10:15:53

+0

檢查編輯。謝謝,但我知道這一點。 :) – FabianCook

+0

@ H2CO3爲什麼MD5不安全? –

2

我認爲鹽在這裏被錯誤地理解。鹽的想法是它應該是獨一無二的。原因是當你創建散列時,一些不同的字符串可能具有相同的散列。

在你的榜樣你哈希密碼太多,所以它不會像:145ac26ff093c6e1317f7d5fb4c9fd11c77be975password

附:使用bcrypt。它更可靠。

3

首先你不應該直接存儲MD5,你已經regognized的。 PHP 5.5將帶來新的方法來輕鬆創建和驗證1行密碼,直到您可以使用https://github.com/ircmaxell/password_compat(向前兼容)來生成&驗證安全密碼哈希值。