3

阅读这个关于密码散列的优秀答案并想知道如何实现它:

邪恶的跳蚤写道:

为每个用户生成一个随机数;仅此一项就击败了彩虹桌。这是一个随机数,根据范围,它会扩展产生的哈希值的数量。

那么除了用户密码之外,在我的数据库中存储一个唯一的令牌吗?

原帖中的示例代码:

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

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

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

顺便说一句,你推荐这种散列方法吗?

4

1 回答 1

3

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

由您决定是否信任您的数据库服务器(以及与它的连接)以使用数据库支持的散列算法并让数据库进行数学运算:

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

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

编辑:关于区分丢失用户无效密码的 ThiefMaster 评论是经典的安全漏洞,它允许攻击者获取有效用户名列表并专注于破解他们的密码,而不是在黑暗中钓鱼。我强烈反对它。

于 2011-04-07T10:37:46.733 回答