如何正确实现hash_hmac?

时间:2011-04-07 10:22:53

标签: php hash passwords hmac

阅读关于密码哈希的this excellent answer并想知道如何实现它:

The Wicked Flea写道:

  

为每个用户生成一个nonce;仅这一次就击败了彩虹桌。这是一个随机数,根据范围,可以扩展产生的哈希值。

因此,在用户密码旁边,我的数据库中存储了一个唯一的令牌?

原帖中的示例代码:

function hash_password($password, $nonce) {
  global $site_key;
  return hash_hmac('sha512', $password . $nonce, $site_key);
}

如何使用此代码验证密码?让我解释一下:

当用户提交密码时,我需要生成它的哈希,以检查电子邮件地址哈希密码匹配的现有数据库行。当我对用户$nonce一无所知时,如何选择此行?我错过了什么吗?也许我只需要通过他的电子邮件地址选择用户,然后再验证密码哈希?

是的,你推荐这种散列方法吗?

1 个答案:

答案 0 :(得分:3)

我认为你已经掌握了这个主意。同样的概念应用于一般的UNIX风格的盐渍密码 - 用密码以明文形式存储盐并通过用户名检索,然后使用salt和提供的密码生成新的哈希值,以便与存储的值进行比较。

您可以考虑使用数据库支持的散列算法并让数据库进行数学计算,确保您信任您的数据库服务器(以及与它的连接):

SELECT * FROM users WHERE email = 'email' AND password = SHA1(CONCAT('cleartextpass',nonce));

或者您可以在检索完所有匹配的电子邮件后在代码中进行数学计算。

编辑:ThiefMaster对区分缺少用户无效密码的评论是典型的安全漏洞,它允许攻击者获取列表有效用户名,专注于打破密码,而不是在黑暗中钓鱼。我强烈建议反对