Nic*_*ich 5 security web-applications
当有人丢失密码时,他们会点击丢失或忘记的密码链接.他们将需要输入自己的电子邮件地址,然后回答他们自己的秘密问题,如果这个秘密的问题是正确的,电子邮件将与24小时后失效的链接发送给他们.
在发送电子邮件时,会在包含此信息的数据库表中输入记录: - 需要重置密码的人的电子邮件 - 重置密码的时间将到期 - 请求休息的时间密码已提交.
发送的链接将引导用户输入允许他们输入新密码的表单.在这种形式下,他们需要输入他们的电子邮件地址和密码X2.
当他们点击提交时,会对db进行检查以确保电子邮件有效(密码正在重置)并且尚未过期(通过比较两个日期以查看到期时间是否已过,这是24小时)
如果电子邮件是有效的,且尚未到期,这两个密码相匹配和满足最低的REQ,那么新的密码应用.
成功时会显示确认消息.
Q1.这是密码恢复的好模型吗?Q2.如何确保发送到用户地址的链接是唯一的?在那个没有人会得到相同的链接?所以,没人能随便去的密码重置页面,并尝试不同的电子邮件,而有需要重置有,对于只考虑工作的自己独特的URL每个帐户.
关于Q2:
我在想,当用户要求有自己的密码重置时,产生并存储在24小时后失效相同的记录一个随机的唯一ID.这个随机唯一id的列可以被称为"rid"
将发送给用户的电子邮件中的链接将以?rid = xxxxxxxxxxxxx结尾
当用户在重置密码的页面中单击"提交"时,页面顶部的"rid"用于从db获取相应的电子邮件地址,以将其与表单中的电子邮件地址进行比较.这样做可以确保每个密码重置案例都有自己唯一的URL,其他帐户无法使用该URL重置其密码.
这是一个可行的解决方案?
任何贡献或建议将不胜感激.
最佳:
有十亿个站点实施了十亿个认证方案,在99.999%的情况下,这是不必要的.作为开发人员,我为什么要相信您不以纯文本形式存储密码或泄露密码或自行遭受黑客入侵?很少有人为每个网站使用不同的密码......
如果那是不可能的,那么make尽可能无忧无虑:
https://site.com/account/reset?key=a890ea8219175f890b7c123ee74a22).一些与我的帐户绑定的唯一哈希值会在如此多的小时内到期.尽可能使用SSL.我也不喜欢基于以下内容随机生成的密码:
随机生成的密码解决方案也意味着您将始终使用基于密码的解决方案的心态,当基于链接的身份验证似乎是可用性和安全性的未来(OpenID等)时(我不想要一百个)小网站知道我的登录信息!).
更新以回复评论:
为什么哈希应该足够了:如果一个黑客可以猜测你生成的哈希值(并且在一个小时内)的完整128位(那么),那么为什么他或她也不能猜出电子邮件呢?我知道要求电子邮件和/或安全问题"感觉"更安全,但如果你考虑一下,电子邮件通常是非常可预测和统一的,熵率低.我怀疑它们可以被视为包含超过50位的信息.(可能要少得多.)我打赌你我很快会猜到你的电子邮件,而不是50位的随机整数.但如果真的很担心,你需要做的就是在哈希中添加更多的位.过度杀戮模式应该256位左右 - SHA256(salt, email, old pw hash, time stamp, maybe some bytes from /dev/urandom)或类似的...如果黑客能够预测到这一点,那么你真的无能为力.显然,他可以控制黑客帝国,如果他愿意,可以将他的想法投射到硬盘内的磁盘上.
仍然是Pro-OpenID:我访问的任何新网站都要求我创建一个用户应该非常有说服力地知道为什么他们想知道我的(一次性)密码以及他们在安全性方面为我提供的OpenID或Google/Facebook /等等.没有 - 或者为什么他们不信任Google/Facebook /等.没人(我知道)记得30个不同的密码.通常人们会重复使用它们,所以如果这些第三方网站创建者想要,那么他们就很容易欺骗他们的用户.如果我使用我的常规信息在您的网站上注册,您可以立即接管我的Last.FM和Reddit帐户,以及可能已经使用了几次并且被遗忘的十几个网站.事实上,在这些现代,我有点期待如果他们想要他们严格不需要的细节,要么是无知或有恶意,所以这就是为什么我把它称为一次性密码 - 每次注册就像我说"在这里,拥有我的Reddit帐户,它是与我将用于您的网站的L/P相同(否则我会忘记).没关系,我不是特别依赖它." 当然,谷歌实际上可以接管我在线自己的所有内容,但是现在我会比你更信任谷歌(没有冒犯!).
Q1. 恕我直言,有一个缺陷。为什么要求用户输入新密码?我宁愿生成一个新的随机密码并发送给他。收到后,用户可以使用随机生成的密码登录,然后在他/她的个人资料中更改它。
我建议大多数网站使用以下系统:
简单、通用,用户不会流失。
现在,您可以通过以下方式提高安全性(减少滥用):
顺便说一句,但这只是我个人的意见,不要提供秘密问题/答案功能,除非需要。我非常痛苦地记住我在哪里回答了什么,所以我忘记答案的风险可能比忘记密码更大。