【问题标题】:Check if username (Hashed) or email(Hashed) already exist with pdo使用 pdo 检查用户名(哈希)或电子邮件(哈希)是否已存在
【发布时间】:2018-01-24 17:34:18
【问题描述】:

我正在尝试验证 usernameemail 是否已在注册表中,但我不明白该怎么做,因为两者都在我的数据库中使用 password_hash() 进行了哈希处理,我该怎么做比较,用户在 pdo 中使用数据库输入?请解释一下代码。

【问题讨论】:

  • $hashedEmail = get_hashed_email_from_database(); if(password_verify($_POST['email'], $hashedEmail)){//they match} php.net/manual/en/function.password-verify.php
  • 顺便说一句,你为什么要散列电子邮件?
  • 嗯……这就是为什么散列主要帐户标识符(用户名/电子邮件)并不是非常有用的原因。至少您需要在没有单独盐的情况下对其进行哈希处理,但这也不是非常有用。
  • 为了安全起见,例如如果有人入侵了我的数据库,则电子邮件是“安全的”
  • 非常安全,是的……而且没用。你不妨用随机垃圾替换它,因为它对你有好处。

标签: php pdo password-hash


【解决方案1】:

如果您的电子邮件使用每个散列唯一的盐进行散列,则除了针对数据库中的所有散列测试针头之外,没有其他方法可以测试是否存在任何特定电子邮件。例如:

foreach ($db->query('SELECT email_hash FROM users') as $user) {
    if (password_verify($_POST['email'], $user['email_hash'])) {
        $found = true;
        break;
    }
}

没有其他方法,因为没有单独的盐,您无法重新创建哈希,而且由于您不知道要查找的盐,您只需要全部完成。

如果你要散列你需要在数据库中搜索的数据,至少它不能被加盐。但是,如果它没有加盐,它对你试图防御的情况几乎没有保护作用。底线:散列您需要查询的数据是毫无意义的。

【讨论】:

  • 谢谢,这就是解决方案!
  • 如果您指的是 PHP sn-p:不,那是一个 可怕 解决方案, 我希望这是不言而喻的。如果你有几千个左右的用户,这将变得难以忍受。
  • @A.Rossi - 你不能使用这个例子,因为函数 password_hash() 被设计得很慢,这意味着只有少数用户的请求只需要几秒钟来搜索用户.
猜你喜欢
  • 2011-05-19
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
相关资源
最近更新 更多