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
address3) When confirmed, the user is asked to change password
号
然而,这难道不是对
谢谢
如果您正确构造了散列,则URL单击必须来自请求重置的IP地址。这将要求MITM欺骗IP和/或伪造头。虽然这是可能的,但是您越能将哈希标识给所讨论的系统,就越难"结束"哈希。
还建议guid是特定条件的单向哈希。也可以使用私钥解锁的公钥对请求中的系统数据进行加密,以便在单击URL时,哈希必须附带相同的公共加密系统数据,唯一可以对这些值进行解密的系统将是服务器上的私钥。基本上是对哈希的psuedo pki附件。
验证用户身份的方法是共享的秘密(密码)。
如果用户忘记了这个秘密,您需要一种建立新的共享秘密的方法。不管你怎么做,为了分享这个新的秘密,你仍然需要对用户进行身份验证。
如果您知道的关于用户的唯一信息是他们的电子邮件地址,那么您需要某种方式来确认请求重置的用户控制了该电子邮件地址。
到目前为止,唯一的方法就是通过电子邮件向该电子邮件地址发送一个秘密,并检查他们是否收到了。
它总是会对一个足够的偷偷摸摸的MITM攻击开放。
您不发送临时密码的原因是为了避免"用户不必担心更改,因此继续使用不安全的临时密码而不是他们自己的安全密码"。
为了降低中间人攻击的风险,我采用以下措施:
- 重置请求只能使用一次。
- 如果不使用重置请求,它将在一小时后过期。
- 无论最终完成还是过期,所有重置请求都将被永久记录。