与用户名分开存储密码

时间:2012-06-08 14:42:35

标签: mysql security password-protection

我最近对最近关于高调网站被黑客入侵的新闻文章进行了网站安全性概述。 LinkedIn

所以我的问题是:

如何将用户密码与其用户名和其他信息完全分开?这样黑客就只能获得密码,而不是相应的用户名。

编辑:我忘了说我已经将密码存储为哈希(并将其保存)。

5 个答案:

答案 0 :(得分:4)

无论你怎么做,仍然需要一种方法让认证机制将用户名/密码绑定在一起,所以你要做的就是徒劳无功。

您应该将密码存储为无法解密的哈希值,而不是那条路线,而不是accepted best practice

http://blog.moertel.com/articles/2006/12/15/never-store-passwords-in-a-database

答案 1 :(得分:2)

我认为添加安全性的最佳方式与使用Google帐户相同。当您使用正确的密码登录(使用您想要的任何algorythm在数据库中编码,但我建议使用Bcrpyt),您将在手机上收到密码。你可以用电子邮件来做。它变得越来越复杂,你也可以添加盐和东西来让事情更难破解。

请记住,如果您可以创建它,则可以撤消它。总是。这只是一个时间,时间,金钱和意志的问题。

对于你的问题,没有。您始终需要将用户名(即:帐户)与密码绑定。我想你可以将它存储在两个服务器上的两个数据库中,并使用带有salt和hash的多个服务器,但正确和可接受的方法就是使用像我说的那样算法编码并进行比较。

答案 2 :(得分:1)

您在网站上保持用户名和密码分开的最简洁方法是根本不保留密码。

将密码和身份验证委派给第三方服务(如Google)并实施OpenID。
http://openid.net/
那么你只是存储用户名而你不会知道密码数据,因此你不可能发起破坏,密码和用户名永远不会在你的系统中连接。
以下是杰夫阿特伍德的主题:
http://www.codinghorror.com/blog/2010/11/your-internet-drivers-license.html

编辑:在回复以下评论时,如果您的Google帐户遭到入侵,则很可能所有子帐户都遭到入侵。这就是像Google这样的安全认证方案必不可少的原因。这里没有必要重新发明轮子。您可以使用两步验证进一步保护您的Google帐户 http://www.codinghorror.com/blog/2012/04/make-your-email-hacker-proof.html
我认为没有理由为什么每个站点都应该作为一个独特的身份验证器...它以牺牲安全性为代价来促进Web碎片化。

答案 3 :(得分:0)

不要存储密码,而是存储密码的哈希

幸运的是,mysql为此提供了一个安全(单向)散列函数:PASSWORD()

您的查询只是保存哈希而不是纯文本密码,如下所示:

update user_table set
password = PASSWORD(?)
where user_id = ?

可以这样检查:

select * from user
where user_id = ?
and password = PASSWORD(?); // returns the row if password correct

官方mysql文档中的Password Hashing in MySQL文章彻底解释了这一切。

答案 4 :(得分:0)

据我所知,LinkedIn使用SHA1 encyption使用未加盐的加密散列密码。似乎更明智的做法是“加密”你的密码。如果您正在为每个用户使用随机盐腌制,那么您的状态非常好。如果没有:

这意味着在散列之前生成随机位字符串并将它们连接到您的密码上。此外,您还为每个用户存储随机位字符串,并在用户提供密码哈希时将其从数据库中提取

密码为'salted'(与为用户存储的salt连接),然后对该salted字符串进行哈希处理,并使用数据库中的用户哈希密码进行验证  这几乎可以肯定地保证了唯一的哈希值,并使得密码哈希表更难以反向工程回逻辑密码,因为哈希函数的输出依赖于知道为每个用户分配的自定义盐。

如果有人知道为什么LinkedIn不会给他们的哈希加盐,我很乐意听到你的意见。从我读过的所有内容来看,SHA1很容易随着时间的推移而被破译。