2011-07-15 95 views
6

我正在使用web administration module for mailservers(如果您想查看,它是開源的)。如何在PHP中安全地生成SSHA256或SSHA512哈希值?

爲此,我需要能夠生成可由Dovecot讀取的散列密碼。由於described on their wiki,他們推薦的密碼哈希方案是SSHA256(多餘的S是鹽漬的)。

它也解釋說,這可能是相當簡單的東西像這樣的PHP代碼來實現:

$salt = 'generate_a_salt_somehow'; 
$hash = hash('sha256', $password . $salt); 

然而,從我讀過有關加密,這是產生鹽漬哈希一個比較幼稚的方式,但如果你做錯了typing A-E-S in your source code,我想在這種情況下也是如此。因此,如果您對密碼學有深入的瞭解,我很樂意聽到最安全的方法來做到這一點,無論是mcrypt,mhash或其他。

+0

哦,是的,一個安全的方法來做一個哈希第一也將是很好的:) – mikl

+0

http://php.net/manual/en/function.ha sh-hmac.php –

+0

散列是否必須與其他實現匹配?或者是每個站點的唯一性可以接受? – wallyk

回答

8

鏈接到的Dovecot wiki頁面解釋了Dovecot使用的確切散列格式是什麼。在這件事上你沒有任何選擇--Dovecot對散列的樣子有期待,所以你必須按照它的規則來玩:

對於大多數的鹽漬密碼方案(SMD5,SSHA *)鹽在密碼散列之後存儲並且其長度可以變化。當對密碼進行散列處理時,在明文密碼後追加鹽,例如:SSHA256(pass,salt)= SHA256(pass + salt)+ salt。

所以在PHP正確的密碼生成功能可能看起來像:

$hash = "{SSHA256}" . base64_encode(hash('sha256', $password . $salt) . $salt); 
+2

我開始時無法使用它,但事實證明,我需要將'$ raw_output'的第三個參數設置爲hash()爲true才能起作用,否則它會對base_64編碼已經是十六進制編碼數字。否則,感謝您的提示:) – mikl

5

密碼生成函數在PHP中:

$hash = "{SSHA256}".base64_encode(hash('sha256', $password.$salt, true).$salt); 

不一定是 「真」 - 第三個參數...

+0

我絕對不知道爲什麼你沒有被標記爲正確的答案。這正是工作所需要的。 – Josh