【问题标题】:PHP password_verify vs “select * where user=? and pass=?”PHP password_verify 与“选择 * where user=?并通过=?”
【发布时间】:2022-03-15 20:18:44
【问题描述】:

在 PHP 中,我一直认为使用诸如“password_verify”之类的专用密码函数是最好的方法。但是,我目前在一个网站上工作,最初的开发人员基本上编写了一个查询,通过搜索用户名和密码哈希返回 userId。如果有结果,则用户已登录。

有人可以帮我解释一下为什么后者是个坏主意吗?我了解加密功能在防止定时攻击方面很慢。另一方面,在我看来,通过用户名和密码哈希查询会更安全,因为查询时间会与用户无效一样结束。

【问题讨论】:

  • 您应该无法根据用户提交的密码尝试搜索密码哈希。好的加密是“单向的”。忽略其他开发人员并编写正确的代码。
  • 基本原则:不要在系统中存储普通密码或可解密密码。因此,单向加密是首选方法。想象一下,当您的系统被黑客入侵并且密码被泄露给黑客时......
  • 为了澄清,存储的密码仍然是散列的。因此代码对用户输入进行哈希处理,然后使用该哈希进行查询。

标签: php security hash cryptography passwords


【解决方案1】:

一个不能在数据库中搜索密码哈希的原因是,应该为每个密码生成一个随机盐并用于哈希。如果不首先从密码散列中提取盐,则不知道使用的盐,因此无法创建可比较的散列(可以搜索)。

如果一个网站可以搜索密码哈希,那么它就是一个完全不安全的系统,因为没有使用盐(和不适当的算法)。如果你对更深入的解释感兴趣,你可以看看我的tutorial关于安全密码存储。

【讨论】:

    【解决方案2】:

    您不能通过用户名和哈希查询例如。 从 user_id=xx AND password=password_hash 的用户中选择 *

    这是无法做到的,因为用户只会传递普通密码而不是哈希,因为哈希将在系统中创建,并且没有用户会记住该哈希甚至看到该哈希。

    现在你的下一个问题是为什么你应该使用 password_verify 函数,因为它更安全,因为它只有在用户提供的密码与存储在数据库中的加密密码匹配时才会匹配,因此它几乎不可能破解加密

    加密密码还可以防止原始密码泄露,以防您的系统被黑客入侵。

    【讨论】:

      猜你喜欢
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      相关资源
      最近更新 更多