重置ASP.NET密码-安全问题?

8
我看到了关于这个问题的各种提问,但还有一些问题没有被问到。如果用户忘记了密码,我希望他们只需要使用他们的电子邮件地址就能重置密码(即没有安全问题/答案)。密码以盐加密哈希的形式存储,因此无法恢复。相反,我只想让用户在确认已请求重置后输入新密码。
一个常见的方法是简单地:
1)创建一个随机的Guid /具有密码学强度的随机数
2)向用户的电子邮件地址发送包含随机数的唯一URL
3)确认后,要求用户更改密码
然而,这难道不会受到中间人攻击吗?如果将临时密码通过互联网发送到电子邮件是不安全的,那么将其与仅发送唯一URL有何区别?
我错过了什么关键步骤,可以使该系统更安全(或者有更好的重置密码方式)?
谢谢
3个回答

9
如果你正确构建哈希,URL 点击将必须来自请求重置的 IP 地址。这将需要中间人欺骗 IP 和 / 或伪造标头。虽然这是可能的,但你越能唯一地识别系统中的哈希,就越难绕过哈希。
建议 guid 是特定标准的单向哈希。还可以使用公钥加密请求中的系统数据,以便私钥解锁时,当点击 URL 时,相同的公共加密系统数据必须与哈希一起附带,而唯一能够解密这些值的系统是服务器上保存的私钥。基本上是哈希的伪 PKI 附件。

我喜欢尝试确保确认链接点击来自于与初始重置请求相同的计算机的想法。 - Nick Higgs
2
关于IP方面,那部分肯定是无关紧要的吧?作为攻击者,我会声称自己忘记了密码,因此密码重置请求来自我的(攻击者)电脑。进行中间人攻击,我会拦截电子邮件,点击链接并更改密码,因为它一直看到我的IP地址。 - keyboardP
可能,但这假定攻击者已经成功入侵了电子邮件帐户。IP地址仅是识别信息的一小部分子集。可以应用其他指标来增加哈希的复杂性。关键是不要依赖任何一个指标,因为每个指标都必须被攻破。需要的指标越多,穿透难度就越大。在某一点上,这变成了努力与结果的问题。 - Joel Etherton
2
请查看此网站以获取其他可用于识别浏览器的数据:http://panopticlick.eff.org/ - Greg
@Greg:现在这个关于足迹的网站真的很有用。谢谢。一定要加入收藏夹中。 - Joel Etherton

7

您用来验证用户身份的方法是共享密码。

如果用户忘记了这个密码,您需要一种建立新的共享密码的方式。无论采取什么方式,都必须首先验证用户身份以便分享新的密码。

如果您所知道的关于用户的唯一信息是他们的电子邮件地址,则需要某种方法确认请求重置的用户控制该电子邮件地址。

目前唯一的方法是通过电子邮件向该地址发送一个秘密代码并检查其是否收到。

但这总会存在足够狡猾的中间人攻击的风险。

不发送临时密码的原因是为了避免“用户无法改变密码,因此继续使用不安全的临时密码而不是自己的安全密码”的问题。


1
同意以上所有观点。只想补充一点,临时密码应该是一次性的:一旦用于用户登录,就不能再次使用,用户必须更改密码,否则用户需要请求新密码。这并不能完全解决中间人攻击的问题,但应该会有所帮助。 - JonoW
临时密码的讽刺是,它可能比用户的实际密码更安全 :D 然而,我正在采用“确认链接”路线,这将在密码更改之前锁定用户。 - keyboardP
通过中间人攻击向量。如果在请求发送新密码时要求输入一个秘密,然后当电子邮件中的链接发送给您并且您单击该链接时,必须再次输入相同的秘密,那么这是否会被否定? - Jonathan Stanton

1
为了减少中间人攻击的风险,我使用以下措施:
  • 重置请求只能使用一次。
  • 如果重置请求未被使用,则在一小时后过期。
  • 无论最终是否完成或过期,所有重置请求都将被永久记录。

我希望重置密码的有效期比一个小时更短。重置密码的意图是为了立即访问。不能指望“诚实”的用户等待一个小时来使用重置功能,这是不合理的。 - Joel Etherton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接