2011-07-15 65 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