我看到有人編碼這樣的密碼哈希,
md5(uniqid(mt_rand('password', 15), true));
是一個安全的方式去做這個?是甚至解決了嗎?
我看到有人編碼這樣的密碼哈希,
md5(uniqid(mt_rand('password', 15), true));
是一個安全的方式去做這個?是甚至解決了嗎?
這不僅是不安全,它甚至不工作。
mt_rand
需要兩個參數,一個最小值和一個最大值。
mt_rand('password', 15)
此轉換'password'
爲int(0
),然後返回0
和15
之間的隨機數。
uniqid(mt_rand('password', 15), true)
這然後產生一個唯一的ID,和來自前一步驟,以預先考慮它的隨機數:計算是這樣的:
144ffb22886d58e1.82100749
即字符串然後md5'd。
正如您可以看到,這個代碼是100%沒有用的。原始密碼被轉換爲0
並永遠丟失,所以你所做的只是散列隨機數,這是毫無意義的。現在你已經有了散列,沒有辦法再次驗證它。由於密碼被轉換,無論用戶輸入什麼都不重要。
所以,不,這個代碼是不安全的,不使用它。
就個人而言,我用的是phpass library。它很安全,而且使用簡單。
可以說,如果我使用'mt_rand()'就像這樣,'md5(uniqid('passwrd',true));'那更好嗎? – itsme 2012-07-09 18:32:05
@itsme:問題在於:您以後如何驗證密碼?您需要能夠稍後生成相同的散列,並且不能使用'uniqid'來完成。 ['uniqid'](http://php.net/manual/en/function.uniqid.php)不適用於密碼,它用於生成唯一的ID(如UUID)。 – 2012-07-09 18:35:03
爲什麼是-1?這個答案有什麼問題? – 2012-07-09 18:37:34
說實話,我甚至不會使用MD5作爲存儲密碼的哈希算法。我會考慮使用類似bcrypt的東西。此外,我甚至不知道你的例子會如何工作,但是無論如何,如果你想確保它的安全,那麼至少應該遠離md5,sha1,並從別人那裏學習錯誤並使用鹽。
不,它不是一種安全的方式。它是可破解的,在你的例子中,它是不可重複的。您必須將隨機值與散列本身一起存儲。如果數據庫受到威脅,那麼使用哈希變得非常簡單。
你應該知道,MD5和SHA1是兩個最弱的哈希算法,這是在PHP可用。
更好的是使用crypt()
函數,用CRYPT_BLOWFISH
或PBKDF2。
更新
而且,PeeHaa提到,這是行不通的。 mt_rand('password', 15)
將導致Warning: mt_rand() expects parameter 1 to be long, string given on line X
。
@PeeHaa,嗯,是的,因爲它不可重複。 – 2012-07-09 18:24:44
他們如何驗證密碼一旦哈希?另外'mt_rand'將int作爲參數,而不是字符串。 – 2012-07-09 18:17:21
啊,@火箭什麼問題?? !!! – Engineer 2012-07-09 18:19:43
我個人使用[phpass](http://www.openwall.com/phpass/)。 – 2012-07-09 18:22:35