重置 ASP.NET 密码 - 安全问题?
Posted
技术标签:
【中文标题】重置 ASP.NET 密码 - 安全问题?【英文标题】:Resetting ASP.NET password - security issues? 【发布时间】:2011-01-10 04:32:52 【问题描述】:我已经看到有关此问题的各种问题,但有几个问题尚未提出。如果用户忘记了密码,我希望他们能够仅使用他们的电子邮件地址来重置密码(即没有安全问题/答案)。密码存储为加盐哈希,因此无法恢复。相反,我希望用户在确认他们已请求重置后输入新密码。
已经提到的一种常用方法是:
1) 创建一个随机 Guid/加密强随机数
2) 将包含随机数的唯一 URL 发送到用户的电子邮件 地址
3) 确认后,要求用户更改密码
但是,这不是对MITM
攻击开放吗?如果通过 Internet 向电子邮件发送临时密码是不安全的,那么这样做与简单地发送攻击者可以导航到的唯一 URL 有什么区别?
我是否错过了使系统更安全的关键步骤(或者是否有更好的方法来重置密码)?
谢谢
【问题讨论】:
【参考方案1】:为了降低中间人攻击的风险,我使用了以下措施:
一个重置请求只能使用一次。 如果未使用重置请求,它会在一小时后过期。 无论是最终完成还是过期,都会永久记录所有重置请求。【讨论】:
我会让重置过期的时间比一个小时快得多。重置密码的目的是为了立即访问。期望“诚实”的用户等待一个小时才能使用重置是不合理的。【参考方案2】:您验证用户的方式是共享密钥(密码)。
如果用户忘记了这个秘密,您需要一种方法来建立一个新的共享秘密。无论您采取何种方式,您仍然会遇到验证用户以共享该新秘密的问题。
如果您唯一了解的可用于对其进行身份验证的用户是他们的电子邮件地址,那么您将需要某种方式来确认请求重置的用户控制着该电子邮件地址。
到目前为止,唯一的方法是将秘密通过电子邮件发送到该电子邮件地址并检查他们是否收到。
这总是容易受到足够偷偷摸摸的中间人攻击。
您不发送临时密码的原因是为了避免“用户懒得更改,因此一直使用不安全的临时密码而不是他们自己的安全密码”的问题。
【讨论】:
同意以上所有。只需添加一个临时密码应该是一次性使用:一旦用于登录用户,就不能再次使用,用户必须更改它,否则用户需要请求新密码。它无论如何都无法绕过 MITM 攻击,但应该在一定程度上有所帮助。 临时密码的讽刺之处在于它可能比用户的实际密码更安全 :D 但是,我将沿着“确认链接”路线将它们锁定,直到密码改变了。 使用 MITM 攻击向量。如果当您要求向您发送新密码时,您被要求提供一个秘密,这是否会被否定。那么当电子邮件中的链接发送给您并且您单击该链接时,您必须再次输入相同的密码?【参考方案3】:如果您正确构建哈希,则 url 点击必须来自请求重置的 IP 地址。这将要求 MITM 欺骗 IP 和/或伪造标头。虽然这是可能的,但您可以识别相关系统的哈希值越独特,“结束”哈希值就越困难。
还建议 guid 是某些标准的单向哈希。也可以使用私钥解锁的公钥加密请求中的系统数据,这样当点击 url 时,相同的公共加密系统数据必须伴随散列,并且唯一可以解密这些值的系统是保存在服务器上的私钥。基本上是散列的伪 PKI 附件。
【讨论】:
我喜欢尝试确保确认链接点击与初始重置请求来自同一台计算机的想法。 关于IP方面,那部分肯定是无关紧要的吗?作为攻击者,我会声称自己忘记了密码,因此密码重置请求来自我的(攻击者)PC。执行 MITM 攻击,我会拦截电子邮件,单击链接并更改密码,因为它一直看到我的 IP 地址。 可能,但这假设攻击者也已经入侵了电子邮件帐户。 IP 只是识别信息的一小部分。可能会应用其他指标来增加散列的复杂性。关键是不要依赖任何一个指标,因为每个指标都必须受到影响。要求越多,越难通过。在某种程度上,它变成了努力与结果的问题。 酷,有道理。谢谢你的帮助,乔尔! 查看此站点以获取可用于识别浏览器的其他数据:panopticlick.eff.org以上是关于重置 ASP.NET 密码 - 安全问题?的主要内容,如果未能解决你的问题,请参考以下文章