如何在PHP中安全地生成SSHA256或SSHA512哈希?

mik*_*ikl 7 php hash cryptography ssha

我正在为邮件服务器开发一个Web管理模块(如果你想看一下,它是开源的).

为此,我需要能够生成Dovecot可读的散列密码.如他们的wiki所述,他们推荐的密码哈希方案是SSHA256(额外的S用于盐渍).

它还解释说,使用类似PHP代码的方法实现这一点可能相当简单:

$salt = 'generate_a_salt_somehow';
$hash = hash('sha256', $password . $salt);
Run Code Online (Sandbox Code Playgroud)

然而,从我所读到的关于密码学的内容来看,这是一种生成盐渍哈希的相当天真的方法,但是如果你在源代码中输入AES时做错了,我认为在这种情况下也是如此.

因此,如果你对密码学有所了解,我很想知道最安全的方法,无论是mcrypt,mhash还是其他什么.

dus*_*uff 8

您链接的Dovecot维基页面解释了Dovecot使用的确切哈希格式.你在这个问题上没有任何选择--Dovecot对哈希的外观有所期待,所以你必须遵守它的规则:

对于大多数盐渍密码方案(SMD5,SSHA*),盐在密码哈希之后存储,其长度可以变化.在对密码进行散列处理时,请在明文密码后附加盐,例如:SSHA256(pass,salt)= SHA256(pass + salt)+ salt.

因此PHP中适当的密码生成功能可能如下所示:

$hash = "{SSHA256}" . base64_encode(hash('sha256', $password . $salt) . $salt);
Run Code Online (Sandbox Code Playgroud)

  • 我一开始无法使用它,但事实证明,我需要将`$ raw_output`第三个参数设置为hash()为true才能使其正常工作,否则,它必须对已经进行base64编码十六进制编号.否则,谢谢你的提示:) (2认同)

小智 7

PHP中的密码生成功能:

$hash = "{SSHA256}".base64_encode(hash('sha256', $password.$salt, true).$salt);
Run Code Online (Sandbox Code Playgroud)

必然"真实" - 第三个参数......