我想通过php编写安全登录系统,所以我在网上浏览了几天并得到了很好的推荐,提供了如何做到这一点。
但我对其中一个提示有疑问,为什么我要将用户密码保存为数据库中的哈希码?
如果有人可以破解我的网站或数据库,它可以访问我的数据库,对他/她而言,拥有用户密码并不是那么重要。他/她可以访问所有用户信息。那么有什么好处?这样做?
答案 0 :(得分:8)
对于某些形式的攻击,攻击者可能一次只能访问一个特定的表。
如果该表是您的用户表,则攻击者可以以纯文本形式查看密码,并且您已完全用完。
答案 1 :(得分:2)
如果数据库可以访问其他任何人,他就不会拥有每个用户的密码,而是哈希值。并且哈希足以确认用户在登录您的应用程序时输入了正确的哈希值。
它基本上增加了黑客可能会破坏数据的任何努力的额外复杂性。它现在已经是最好的做法了。
重点是:人们倾向于在很多应用程序中使用用户名/密码组合。如果其中一个向黑客提供数据,它可能会打开很多门。
答案 2 :(得分:2)
正如它在PHP manual中所说的那样,散列密码的主要原因是因为用户可能会为多个系统重复使用相同的密码(即使建议不要这样做)。鉴于用户数据库通常也会包含电子邮件地址,因此危害您数据库的黑客将拥有一些有价值的信息,这些信息可能会针对每个用户使用。他们可能会将电子邮件地址和纯文本密码直接发送给用户的电子邮件提供商并获取访问权限。你不希望这个责任落在你的膝盖上,所以通过哈希密码,你可以在某种程度上减轻你的用户重复使用密码的不良选择。
另外,请考虑有几种方法来破坏数据库。我们不一定只是谈论有人获得完整的命令行访问,或进入phpMyAdmin等 - 他们可能只是通过特定的SQL注入或API中的安全性不足而获得了用户转储。那些“部分”的漏洞可能只会泄露信息的花絮,你肯定不希望其中一个花絮成为纯文本密码,如果你完全可以通过没有明文密码来防止这种情况。这里的底线是你为攻击者的路径添加了另一个障碍。
但是,散列密码并不是最终的结果。攻击者可以使用强力方法来反转散列。请务必使用最佳可用加密方法(在我链接的文章中讨论),并考虑在哈希中添加“salt”以使暴力/彩虹表方法不太可能成功。答案 3 :(得分:1)
大多数用户在多个网站上重复使用密码。我相信你也这样做了。
如果您拥有用户的数据,如电子邮件地址或更多基本信息,如姓名或位置,那么该用户很容易被其他网站攻击,因为没有哈希密码的缺陷(正确)。
只是散列甚至不够安全,你还应该包含一个盐,这样就更难找出用户背后的密码。
答案 4 :(得分:1)
值得一提的是,如果黑客可以访问您的users
表并查看哈希值,他可以尝试使用rainbow table来破译哈希值,但这样会非常慢。
答案 5 :(得分:0)
有一件事是获取有关您的用户的所有信息,其他事情是代表这些用户执行操作。想想存储信用卡号码的电子商务网站(例如在另一个数据库中),或者你可以留下关于朋友等的评论的社交网站:)
答案 6 :(得分:0)
哈希不是纯文本密码,您无法以登录形式输入哈希来登录。因此,破解哈希可能需要一些(大)时间。
答案 7 :(得分:0)
有些用户可能不希望他们的密码可以被网站所有者自己看到。许多人对他们使用的每个网站都使用相同的密码。