关于重置ASP.NET密码:重置ASP.NET密码 – 安全问题?

Resetting ASP.NET password - security issues?

我看到了关于这个问题的各种各样的问题,但是还有一些问题没有被问到。如果用户忘记了他们的密码,我希望他们能够只使用他们的电子邮件地址(即没有安全问题/答案)重置密码。密码存储为盐散列,因此无法恢复。相反,我希望用户在确认他们请求重置后输入一个新密码。

A common method that's been mentioned is to simply:

1) Create a random Guid/Cryptographically strong random number

2) Send a unique URL containing the random number to the user's email
address

3) When confirmed, the user is asked to change password

然而,这难道不是对MITM攻击开放吗?如果通过互联网向电子邮件发送临时密码是不安全的,那么这样做与简单地发送攻击者可以导航到的唯一URL有什么区别?我是否错过了使系统更安全的关键步骤(或者是否有更好的方法重置密码)?

谢谢


如果您正确构造了散列,则URL单击必须来自请求重置的IP地址。这将要求MITM欺骗IP和/或伪造头。虽然这是可能的,但是您越能将哈希标识给所讨论的系统,就越难"结束"哈希。

还建议guid是特定条件的单向哈希。也可以使用私钥解锁的公钥对请求中的系统数据进行加密,以便在单击URL时,哈希必须附带相同的公共加密系统数据,唯一可以对这些值进行解密的系统将是服务器上的私钥。基本上是对哈希的psuedo pki附件。


验证用户身份的方法是共享的秘密(密码)。

如果用户忘记了这个秘密,您需要一种建立新的共享秘密的方法。不管你怎么做,为了分享这个新的秘密,你仍然需要对用户进行身份验证。

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

到目前为止,唯一的方法就是通过电子邮件向该电子邮件地址发送一个秘密,并检查他们是否收到了。

它总是会对一个足够的偷偷摸摸的MITM攻击开放。

您不发送临时密码的原因是为了避免"用户不必担心更改,因此继续使用不安全的临时密码而不是他们自己的安全密码"。


为了降低中间人攻击的风险,我采用以下措施:

  • 重置请求只能使用一次。
  • 如果不使用重置请求,它将在一小时后过期。
  • 无论最终完成还是过期,所有重置请求都将被永久记录。