2012-07-09 85 views
6

可能重複:
Secure hash and salt for PHP passwords使用MD5確保即使其難度

我看到有人編碼這樣的密碼哈希,

md5(uniqid(mt_rand('password', 15), true)); 

是一個安全的方式去做這個?是甚至解決了嗎?

+8

他們如何驗證密碼一旦哈希?另外'mt_rand'將int作爲參數,而不是字符串。 – 2012-07-09 18:17:21

+1

啊,@火箭什麼問題?? !!! – Engineer 2012-07-09 18:19:43

+0

我個人使用[phpass](http://www.openwall.com/phpass/)。 – 2012-07-09 18:22:35

回答

6

這不僅是不安全,它甚至不工作。

mt_rand需要兩個參數,一個最小值和一個最大值。

mt_rand('password', 15) 

此轉換'password'爲int(0),然後返回015之間的隨機數。

uniqid(mt_rand('password', 15), true) 

這然後產生一個唯一的ID,和來自前一步驟,以預先考慮它的隨機數:計算是這樣的:

144ffb22886d58e1.82100749 

即字符串然後md5'd。

正如您可以看到,這個代碼是100%沒有用的。原始密碼被轉換爲0並永遠丟失,所以你所做的只是散列隨機數,這是毫無意義的。現在你已經有了散列,沒有辦法再次驗證它。由於密碼被轉換,無論用戶輸入什麼都不重要。

所以,不,這個代碼是不安全的,不使用它。

就個人而言,我用的是phpass library。它很安全,而且使用簡單。

+0

可以說,如果我使用'mt_rand()'就像這樣,'md5(uniqid('passwrd',true));'那更好嗎? – itsme 2012-07-09 18:32:05

+0

@itsme:問題在於:您以後如何驗證密碼?您需要能夠稍後生成相同的散列,並且不能使用'uniqid'來完成。 ['uniqid'](http://php.net/manual/en/function.uniqid.php)不適用於密碼,它用於生成唯一的ID(如UUID)。 – 2012-07-09 18:35:03

+1

爲什麼是-1?這個答案有什麼問題? – 2012-07-09 18:37:34

2

說實話,我甚至不會使用MD5作爲存儲密碼的哈希算法。我會考慮使用類似bcrypt的東西。此外,我甚至不知道你的例子會如何工作,但是無論如何,如果你想確保它的安全,那麼至少應該遠離md5,sha1,並從別人那裏學習錯誤並使用鹽。

+0

我認爲,如果您使用良好的鹽,md5可以是安全的,但我同意新的算法是可行的。 – 2012-07-09 18:19:48

+1

@Rocket如果你使用md5()只是用一個鹽散列密碼,它是不安全的 – PeeHaa 2012-07-09 18:21:19

+0

MD5已經在性能方面進行了超級優化,因此在某些情況下,它仍然是可行的,但我仍然不會建議MD5安全地實現密碼散列。 – sean 2012-07-09 18:23:33

11

不,它不是一種安全的方式。它是可破解的,在你的例子中,它是不可重複的。您必須將隨機值與散列本身一起存儲。如果數據庫受到威脅,那麼使用哈希變得非常簡單。

你應該知道,MD5和SHA1是兩個最弱的哈希算法,這是在PHP可用。

更好的是使用crypt()函數,用CRYPT_BLOWFISHPBKDF2

更新

而且,PeeHaa提到,這是行不通的。 mt_rand('password', 15)將導致Warning: mt_rand() expects parameter 1 to be long, string given on line X

+0

@PeeHaa,嗯,是的,因爲它不可重複。 – 2012-07-09 18:24:44