2012-07-27 91 views
0

我試圖創建一個哈希函數,給定一個隨機鹽,從它生成密碼哈希。Crypt函數爲相同的密碼生成相同的散列

問題是,如果我爲兩個不同的用戶輸入相同的密碼,則生成的散列對於兩者都是相同的。

Waht可能是問題嗎?

public function generateSalt() 
{  


    return $salt = substr(sha1(uniqid(rand(), true)), 0, 32); 
} 

public function pwdEncrypt($password, $salt) 
{  

    $hash = crypt($password, '$2a$' . $salt . '$');  
    return $hash; 
} 

public function registerUser($nome, $email, $password, $permitions, $active) 
{ 



    $this->nome = $nome; 
    $this->email = $email; 


    $salt = $this->generateSalt(); 


    $this->password = $this->pwdEncrypt($password, $salt); 

    //INSERT METHODS BELOW 
} 
+0

發現向我們展示瞭如何調用' pwdEncript()'。順便說一下,正確的拼寫是「加密」 – ThiefMaster 2012-07-27 13:40:45

+0

@ThiefMaster感謝您的通知。我已經使用你問的信息編輯了帖子 – 2012-07-27 13:43:02

+0

確保你實際上傳遞了$ password和$ salt,可能沒有值傳遞給這些變量,你得到的只是'crypt()' $ 2a $'和'$' – Austin 2012-07-27 13:44:07

回答

3

不是如何使用crypt與河豚($2a$

你需要指定的強度,並在年底的鹽。

試試這個crypt($password, '$2a$08$'.$salt);

明顯增加,以提高安全性的強度,處理時間爲代價的。

我還要補充,如果您使用的是PHP版本大於5.3.7,你應該使用$2y$爲您Blowfish算法,爲$2a$的攻擊在2011年

+0

超級!謝謝! – 2012-07-27 13:51:29

+0

@JoãoDias:請參閱我的編輯。對於您選擇的算法有一些指導。 – Leigh 2012-07-27 13:52:07

+0

我有ssen,但是,$ 2y $似乎沒有工作......我在本地主機上運行PHP 5.3.5 – 2012-07-27 13:53:15

2

crypt()將使用標準的基於Unix DES的算法返回一個散列字符串。

基於DES的標準散列具有從字母「./0-9A-Za-z」一個兩種字符鹽

因爲在你的情況下,第一個三個字符的鹽總是相同的,所用的鹽總是相同的。

使用

return $salt = substr(sha1(uniqid(rand(), true)), 0, 2); 

$hash = crypt($password, $salt); 
+0

如果你的系統有'CRYPT_BLOWFISH'可用,並且這是你想要做的,那麼Leigh的答案就是要走的路。 – MiDo 2012-07-27 13:50:08

+0

我正要問這個!感謝你的付出!這仍然是一個很好的答案;) – 2012-07-27 13:50:54

相關問題