查看我的设计:网站的密码重置工具

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重置其密码.

这是一个可行的解决方案?

任何贡献或建议将不胜感激.

int*_*ger 6

最佳:

  1. 通过OpenID登录.编码复杂度更低,点击次数更少,打字更少,浪费的时间更少.
  2. 完成.问题没有实际意义.不用担心,其他人已经解决了这个问题.

有十亿个站点实施了十亿个认证方案,在99.999%的情况下,这是不必要的.作为开发人员,我为什么要相信您不以纯文本形式存储密码或泄露密码或自行遭受黑客入侵?很少有人为每个网站使用不同的密码......

如果那是不可能的,那么make尽可能无忧无虑:

  1. 我点击"忘记密码?" 链接.这种自动发送,如果我输入一个电子邮件已经是邮件(如失败后,登录尝试).如果我还没有输入密码字段,请告诉我这样做.请勿将我重新加载或转发到其他页面.
  2. 我得到了一些关键链接(例如https://site.com/account/reset?key=a890ea8219175f890b7c123ee74a22).一些与我的帐户绑定的唯一哈希值会在如此多的小时内到期.尽可能使用SSL.
  3. 我点击该链接,您可以通过密钥获取我的帐户详细信息,确保其有效且未过期.我输入两次新密码.我已经知道我的电子邮件地址是什么了,你已经知道我的电子邮件地址是什么了,任何想成为黑客的人都会知道我的电子邮件是什么,所以不要让我输入.链接持续一整天是矫枉过正的.在一小时或更短的时间内完成.
  4. 我讨厌安全问题.别问我这个.它基本上只是第二个密码,故意不那么安全,所以你会永远记住它.我没有频繁的飞行里程,我不知道我母亲的婚前姓名等等.我知道这可以阻止那些可能侵入你的电子邮件的陌生人,但除非你是PayPal我认为这只是过度工程化.
  5. 当您确认密码匹配且可以接受时,请更新数据库(仅存储我的密码的盐渍哈希,而不是密码本身!)并立即登录.难道不是重定向我到登录页面,在这里我必须重新输入我已经给你打了几次,现在的信息(而即使你已经知道这是我,相信我足以改变我自己的密码).那太烦人了.用户不耐烦.

我也不喜欢基于以下内容随机生成的密码:

  1. 通常我只是从邮件中复制粘贴密码.复制粘贴密码是您不希望用户执行的操作.
  2. 我必须手动更改密码,这意味着在用户控制面板或帐户设置或其他任何方面搞乱.我变得不耐烦了!在我使用一次性密码登录的那一刻,您可以使用"更改密码",但这意味着增加了代码复杂性.您现在需要为此添加标志,添加另一个重定向,处理用户在输入新密码时超时的情况等.
  3. 因为我只是人类,而且人类患有多动症,我通常忘记做上述事情,我最终得到一个垃圾密码,我必须在下次需要登录时从我的电子邮件中找到并复制.我的错,但我仍然会责怪你的网站.;-)

随机生成的密码解决方案也意味着您将始终使用基于密码的解决方案的心态,当基于链接的身份验证似乎是可用性和安全性的未来(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相同(否则我会忘记).没关系,我不是特别依赖它." 当然,谷歌实际上可以接管我在线自己的所有内容,但是现在我会比你更信任谷歌(没有冒犯!).


Ars*_*nko 1

Q1. 恕我直言,有一个缺陷。为什么要求用户输入新密码?我宁愿生成一个新的随机密码并发送给他。收到后,用户可以使用随机生成的密码登录,然后在他/她的个人资料中更改它。

我建议大多数网站使用以下系统:

  1. 用户在“密码重置”表单中输入邮件地址。
  2. 邮件已验证(即数据库中是否有具有此邮件地址的用户?)
  3. 新密码是随机生成的并通过邮件发送,然后加盐/散列并保存到数据库中。
  4. 用户登录。

简单、通用,用户不会流失。

现在,您可以通过以下方式提高安全性(减少滥用):

  • 设置密码重置比例。提交表单后,IP 地址和提交的数据就会被记住:现在,在几分钟内,来自同一 IP 地址的任何人都无法再重置密码。
  • 新生成的密码不会替换旧密码:相反,两者都可以使用。想象一下有人重置了另一个用户的密码。如果该用户没有阅读或收到带有新密码的邮件,则他/她必须仍然能够使用旧密码登录。

顺便说一句,但这只是我个人的意见,不要提供秘密问题/答案功能,除非需要。我非常痛苦地记住我在哪里回答了什么,所以我忘记答案的风险可能比忘记密码更大。

  • 您看到什么缺陷?发送适合一次登录的随机密码或适合一次登录的随机链接具有大致相同的安全性。该链接的主要优点是用户可以简单地忽略错误的重置请求。如果您发送随机密码,他们必须针对虚假请求采取行动(更改回密码)。我也不认为同时拥有两个密码是一个好主意。这将缓解暴力攻击,虽然只是稍微缓解,但仍然如此。只要用户控制他们的电子邮件,他们就不必担心错误重置。 (2认同)