【问题标题】:How to securely generate SSHA256 or SSHA512 hashes in PHP?如何在 PHP 中安全地生成 SSHA256 或 SSHA512 哈希?
【发布时间】:2011-07-15 21:48:38
【问题描述】:

我正在开发web administration module for mailservers(如果你想看看它是开源的)。

为此,我需要能够生成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 还是其他方法。

【问题讨论】:

  • 哦,是的,首先准备哈希的安全方法也很好:)
  • 哈希是否必须匹配其他实现?或者每个站点的唯一性是否可以接受?
  • 它必须与 Dovecot 的实现相匹配才能有用,否则用户将无法登录:)
  • 1) 如果可用,我会使用 bcrypt。 2)接受的答案中显示的算法显然很糟糕(太快),所以你不应该使用 SSHA。

标签: php hash cryptography ssha


【解决方案1】:

PHP中的密码生成函数:

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

必然是“真”——第三个参数...

【讨论】:

  • 我完全不知道为什么你的答案没有被标记为正确答案。这正是它工作所需要的。
  • 这很好用;如果您不想要盐,只需将其移除 - 它仍然可以工作。我正在致力于自动创建电子邮件,这是必要的部分。
【解决方案2】:

您链接到的 Dovecot wiki 页面解释了 Dovecot 使用的确切哈希格式是什么。在这件事上你别无选择——Dovecot 对哈希的样子有自己的期望,所以你必须遵守它的规则:

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

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

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

【讨论】:

  • 一开始我无法让它工作,但事实证明,我需要将 hash() 的 $raw_output 第三个参数设置为 true 才能工作,否则,它'd base64-encode 已经是十六进制编码的数字。否则,谢谢你的提示:)
猜你喜欢
  • 2020-11-30
  • 2013-02-02
  • 1970-01-01
  • 2012-04-28
  • 2013-11-29
  • 2013-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多