如何正确实现hash_hmac?

阅读关于密码散列的这个优秀答案,并想知道如何实现它: 邪恶的跳蚤写道:   为每个用户生成一个nonce;仅这一次就击败了彩虹桌。这是一个随机数,根据范围,可以扩展产生的哈希值。 那么在用户密码旁边存储我的数据库中的唯一令牌? 原帖中的示例代码:
function hash_password($password, $nonce) {
  global $site_key;
  return hash_hmac('sha512', $password . $nonce, $site_key);
}
如何使用此代码验证密码?让我解释: 当用户提交密码时,我需要生成它的哈希,以检查电子邮件地址和散列密码匹配的现有数据库行。当我对用户'ѭ1'一无所知时,如何选择此行?我错过了什么吗?也许我只需要通过他的电子邮件地址选择用户,然后再验证密码哈希? 顺便问一下,你推荐这种散列方法吗?     
已邀请:
我想你已经把这个想法钉了下来。在一般的UNIX风格的盐渍密码中应用相同的概念 - 使用密码以明文形式存储盐并通过用户名检索它,然后使用salt和提供的密码生成要与存储值进行比较的新哈希。 您可以考虑使用数据库支持的哈希算法并让数据库进行数学运算,以便您信任您的数据库服务器(及其连接)。
SELECT * FROM users WHERE email = 'email' AND password = SHA1(CONCAT('cleartextpass',nonce));
或者,您可以在检索所有匹配的电子邮件后在代码中进行数学运算。 编辑:ThiefMaster关于区分缺失用户和无效密码的评论是经典的安全漏洞,它允许攻击者获取有效用户名列表并集中精力打破密码而不是在黑暗中捕鱼。我强烈建议不要这样做。     

要回复问题请先登录注册