在最近关于高调网站被黑客攻击的新闻文章之后,我最近对我的网站安全性进行了概述。领英
所以我的问题是:
如何将用户的密码与其用户名和其他信息完全分开存储?这样,黑客只能潜在地获得密码而不是相应的用户名。
编辑:我忘了说我已经将密码存储为哈希(并加盐)。
在最近关于高调网站被黑客攻击的新闻文章之后,我最近对我的网站安全性进行了概述。领英
所以我的问题是:
如何将用户的密码与其用户名和其他信息完全分开存储?这样,黑客只能潜在地获得密码而不是相应的用户名。
编辑:我忘了说我已经将密码存储为哈希(并加盐)。
不管你怎么做,仍然需要一种身份验证机制将用户名/密码绑定在一起,所以你想做的事情是徒劳的。
与其走这条路,不如将密码存储为无法解密的哈希值,这是公认的最佳实践。
http://blog.moertel.com/articles/2006/12/15/never-store-passwords-in-a-database
我认为添加安全性的最佳方法是与 Google 帐户使用相同。当您使用正确的密码(使用您想要的任何算法在数据库中编码,但我建议使用 Bcrpyt)登录时,您将在手机上收到一个密码。您可以使用电子邮件来完成。它变得越来越复杂,您还可以添加盐和其他东西以使事情更难破解。
请记住,如果您可以创建它,则可以反转它。总是。这只是如何,时间,有时是金钱和意志的问题。
对于你的问题,没有。您始终需要将用户名(即:帐户)与密码联系起来。我想您可以将其存储在两台服务器上的两个数据库中,并使用带盐和哈希的多台服务器,但正确且可接受的方法是简单地使用我所说的算法进行编码并进行比较。
在您的网站上保持用户名和密码分开的最干净的方法是根本不保留密码。
将密码和身份验证委托给 Google 等第三方服务并实施 OpenID。
http://openid.net/
那么您将只是存储用户名并且您将不知道密码数据,因此您不可能发起破坏,密码和用户名将永远不必连接到您的系统中一点也不。
这是 Jeff Atwood 关于这个主题的:http:
//www.codinghorror.com/blog/2010/11/your-internet-drivers-license.html
编辑:针对下面的评论,如果您的 google 帐户被盗用,那么很可能所有附属帐户都被盗用。这就是为什么像谷歌这样的安全认证方案是必不可少的。没有必要在这里重新发明轮子。您可以使用两步验证进一步保护您的 Google 帐户
http://www.codinghorror.com/blog/2012/04/make-your-email-hacker-proof.html
我看不出每个网站都应该期望采取行动的理由作为一个独特的身份验证器......它以牺牲安全性为代价促进了网络碎片化。
不要存储密码,而是存储密码的哈希值。
幸运的是,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文章彻底解释了这一切。
根据我阅读的内容,LinkedIn 使用 SHA1 加密使用未加盐的加密散列密码。似乎也“加盐”你的密码会更明智。如果您为每个用户使用随机盐腌制,那么您的状态非常好。如果不:
这意味着在散列之前生成随机位字符串并将它们连接到您的密码中。此外,您还存储每个用户的随机位字符串,并在用户提供哈希密码时从数据库中提取它
密码是“加盐的”(与为用户存储的盐连接),然后对该加盐字符串进行散列并使用数据库中的用户散列密码进行验证 这几乎可以肯定地保证唯一的散列并使密码的散列表更加困难逆向工程回到逻辑密码,因为散列函数的输出还依赖于知道为每个用户分配的自定义盐。
如果有人知道为什么linkedIn 不对他们的哈希值加盐,我很想听听你的意见。从我读过的所有内容来看,SHA1 很容易随着时间的推移而被破译。