2013-10-11 52 views
4

将临时/机器生成的密码作为明文存储在数据库中会有多大的安全问题?临时密码安全 - 以纯文本形式存储

我知道应该使用带盐的单向散列函数来加密密码。用户提供的密码尤其如此,因为用户通常会一遍又一遍地重复使用它们。如果数据库被盗,小偷可能能够访问第三方网站上的用户帐户,例如:公用事业账单,社交网络,甚至是网上银行的潜力。

将临时/机器生成的“欢迎”或“重置”密码作为明文存储在数据库中有多大的问题?密码将通过电子邮件发送给用户,并且必须在登录后进行更改。然后他们提供的密码将被散列。

我问的原因是,有一些不错的属性来存储临时密码作为明文。例如,如果用户没有收到“欢迎”或“重置”电子邮件,管理员可以快速查找他们的临时密码。

由于临时密码是机器生成的,因此如果数据库被盗,小偷将无法访问用户登录的任何第三方网站。然而窃贼可以登录到生成临时密码的应用程序。

分配这些密码一个小的“过期”会限制暴露,但总的来说,我只是想看看这种方法会有多危险。

+3

而不是让管理员查找临时密码,让他们设置一个新的密码。它会显示给他们,但仍然存储它散列。 – Barmar

+0

@Bamar - 感谢您的好建议。提供类似功能的更安全的方法。 – dana

回答

7

您不应该以纯文本格式存储机器生成的密码。

让我们看看攻击者可以做什么,如果他莫名其妙的收益只能读取与SQL注入你的数据库(我做了一个小demo SQL注入可以多么容易,只需点击下箭头得到一个恶意输入)。

具有读取权限的攻击者可能要求为他喜欢的任何电子邮件地址重置密码。因为他可以在数据库中看到新生成的令牌,所以他可以使用该令牌调用重置页面,因此可以更改此用户的密码。不用说,他现在可以冒充原始用户。

像处理其他网站一样处理令牌,即使它不能用于其他网站。用户帐户可访问的数据可能包含其他数据(如生日,真实姓名),可用于破解其他网站。

+1

我想我知道这是一个糟糕的主意,但试图看看我可以逃避什么。谢谢:) – dana

+0

@martinstoeckli我知道它已经有一段时间了,但是你碰巧有一个处理密码恢复的建议,它没有这个缺陷?我们的CMS用于向用户发送明文密码,并将其升级为使用其电子邮件地址向其发送重置链接,但可以通过查看数据库手动重新创建链接。我不知道如何解决这个问题。 – Marie

+0

@Toni - 重置链接通常使用强随机令牌(20个字符)。与弱用户密码相反,存储令牌(SHA-256)的快速哈希而不用腌制是绝对安全的。这使令牌在数据库中可以搜索,您从请求中获取令牌,再次计算散列并在数据库中搜索它。我试图在我的主页上的[article](http://www.martinstoeckli.ch/php/php.html#passwordreset)中更详细地解释这一点。 – martinstoeckli

5

绝对不能存储密码的数据库可言,更不用说以纯文本格式。你应该存储它们的哈希值。为什么请参阅this answer。那么你需要围绕这个事实建立你所有的密码重置设施。关于密码重置功能,另请参阅this answer

+0

感谢您参考一些有用的答案。 – dana