PHP password_verify vs “select * where user=? and pass=?”



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

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

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

如果一个网站可以搜索密码散列,这是一个完全不安全的系统,因为没有使用salt(和不适当的算法(。如果你对更深入的解释感兴趣,你可以看看我关于安全密码存储的教程。

您不能通过用户名和散列查询例如。从用户中选择*,其中user_id=xx AND password=password_hash

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

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

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

相关内容

  • 没有找到相关文章

最新更新