通过邮件重置用户密码的正常流程如下:
然而,维护一个表并使旧字符串等过期似乎有点不必要的麻烦。这种替代方法有明显的缺陷吗?
请注意,用户的密码已经以散列和盐渍形式存储,我只是再次对其进行哈希处理以获得唯一但可重复的字符串。
是的,有一个明显的“缺陷”:这样生成的重置链接在用户更改密码(点击链接)之前不会过期。我真的不明白为什么这会成为一个问题 - 如果邮箱被泄露,用户无论如何都会被搞砸。并且没有重复使用的风险,因为一旦用户的密码更改,重置链接将不再匹配。
答案 0 :(得分:8)
要修复obvious flaw
,请添加当前日期(以及更多与时间相关的信息,表示即使一天中的当前一小部分时间过长),也可以添加到您要生成神秘字符串并检查的内容中它 - 这使得字符串“过期”(如果你想要更长的“到期时间”,你可以检查上一个以及当前的日期或分数)。所以在我看来你的方案非常可行。
答案 1 :(得分:3)
如果有人使用密码哈希访问您的数据库,他们就不会知道实际的密码。如果您实现此系统,那么他们可以生成重置链接并自行重置密码。使用随机字符串和妥协知识,您可以使所有随机字符串无效,并且只有在重置密码的过程中用户即使不知道访问权限也会受到损害。不是一种可能的情况,但鉴于随机字符串的名义开销,它可能值得考虑。
答案 2 :(得分:2)
实际上,在再次考虑这个问题之后,您的方法可能 比“正常流程”更安全。
如果您只是发送回HASH(HASH(user's original password))
,我可以看到这可以为攻击者提供杠杆的场景:
情景1:
Jim
在您的网站上注册为jimjones@microsoft.com
。Jim
请求重置密码,但不使用它。重置电子邮件将永久保留在收件箱中。Jim
更改了您网站上的电子邮件地址。jimjones@gmicrosoft.com
受到Bob
的侵害。Bob
现在通过其分布式GPGPU服务器场进行暴力攻击并恢复Jim
的密码。情景2:
Jim
使用密码jimjonesupinthisma!
作为其银行帐户。Jim
在您的网站上注册为jimjones@microsoft.com
。 jimjones@microsoft.com
与<{1}}的银行帐户无任何关联 Jim
受到jimjones@gmicrosoft.com
的侵害。Bob
现在要求重置,他现在有Bob
。HASH(HASH(jim's password))
现在通过其分布式GPGPU服务器场进行暴力攻击并恢复Bob
的密码,然后使用该密码访问Jim
的银行帐户。场景3:
(您的网站使用TLS,用户通过TLS注册。)
Jim
在您的网站上注册为Jim
。jimjones@microsoft.com
请求在Bob
帐户重置密码。Jim
适用于Room 641A的NSA。Bob
使用他的全球互联网嗅探器获取Bob
,因为它以明文形式通过电子邮件发送至HASH(HASH(jim's password))
。jimjones@microsoft.com
现在通过其分布式GPGPU服务器场进行暴力攻击并恢复Bob
的密码。方案1和方案2的变体一直在发生(取决于哈希和密码的强度),我不太确定3.关键是,你的方法嗅到了不必要的信息,这确实可以利用攻击者对你的用户。
我建议您使用随机生成的令牌 nothing 来处理用户的密码。
答案 3 :(得分:0)
让我们在非常罕见的情况下说,你的两个用户即使在连接随机盐之后也有相同的哈希密码;会有问题吗?我想如果您在重置密码链接中添加电子邮件或Hashid user_id,就不会受到伤害。
答案 4 :(得分:0)
刚刚通过这个问题,并有一个想法:
1)发布JWT(Json Web Token),其中包含有关用户帐户的信息。令牌有一个到期时间,比如1小时。
2)通过电子邮件/链接
将令牌发送给用户3)用户点击链接,令牌被发送到服务器端点,令牌被验证。如果有效,则解压缩令牌并更新用户帐户
这种方法有什么缺陷吗?没有触及数据库(必要时除了新的用户密码)