这个问题与其说是一个技术安全问题,不如说是一个安全策略。
许多年前,我开发了一个asp.net站点,实现了表单身份验证,并将用户密码存储为MD5哈希。从基本的安全新闻来看,很明显MD5已经不再有用了。我看到了处理当前用户的两种可能的计划。
有什么想法吗?我错过了第三种选择?
注意:我喜欢OpenID,但在这个网站上它不是一个选项
发布于 2011-06-24 17:09:53
我曾经两次解决过这个问题:
在这两种情况下,我都没有使用您的选项,而是使用选项3:在用户下次登录时,使用密码生成新的哈希并替换旧的哈希(在对照旧的哈希进行验证之后)。
在添加盐的情况下,这非常简单:我所做的就是默认每个人都使用"“(空字符串)的盐类,它可以连接起来,然后进行散列,而不会对结果哈希产生任何影响;一旦经过身份验证,我就为用户生成一个新的盐,然后重新对密码进行散列,从而保存新的结果。
从MD5升级到SHA-512有点棘手,但只需查看表中has的字符串长度(我没有为新哈希使用新列,只需扩展现有的一列以适应较长的哈希),我就可以知道使用哪种算法,然后对用户进行适当的身份验证;一旦通过身份验证,如果他们仍然在旧哈希中,我将计算一个新的哈希(也会借此机会生成一个全新的盐)并存储它。
当然,在这两种情况下,我最终都会遇到“旧风格”密码仍然存在的情况。在等待了适当的时间(例如6个月)后,只需确定自采用新样式以来还没有登录的密码是“非活动”的:为他们生成和存储一个新的、完全随机的密码(当然,使用新的存储方式),如果他们真的回来了,就必须使用您的密码重置机制来重新访问。(或者,保留原样,但只需删除旧样式的代码即可有效地使其失效。)您也可以(如果适用)向这些用户发送一封电子邮件,要求他们登录以完成其帐户上的安全升级,然后才能使他们的当前密码无效。
当然,这种方法在身份验证例程中需要额外的代码,但这只是暂时的--一旦每个人都升级了(无论是登录还是“强制”进入,就像上一段那样),您可以删除所有负责执行升级的代码。安全升级完成,您的大多数用户(和您的所有常规用户)从来没有注意到任何事情!
发布于 2011-06-24 15:28:17
我以前曾在一家需要做同样事情的公司中使用过选项2。备选方案1没有任何问题,但第2项似乎更简单。
也可以使用PBKDF2,bcrypt,而不是SHA-512作为密码。
好的,Open已经过时了,但是你可以使用out,使用像Twitter或Facebook这样的连接,并且完全消除用户名和密码的存储和管理吗?
发布于 2011-06-24 20:43:41
这不是一个真正的答案,因为它没有解决您的具体问题,但是我同意添加另一个联合您的ID的选项。因此,无论是OpenID、Facebook、Google还是whoever...the,安全存储用户凭证的最佳选择就是干脆不这么做。
TL;DR:联邦身份验证(如果/如果可能的话)。
https://security.stackexchange.com/questions/4754
复制相似问题