重置登录帐户的安全方法

Safe way to reset login account

我正在开发一个允许用户存储和加密信息的应用程序,其中一些信息可能是敏感信息。最近出现了这个问题 "what if the user loses the password?" 目前无法在此应用程序中恢复丢失的密码。出于隐私考虑,我想避免让应用程序向我的服务器发送任何信息。我想也许可以设置一种方法,通过将特定短语放入用户名和密码字段来重置登录信息,用户可以通过电子邮件请求。但是我不确定这是否是个好主意。有没有更好的方法来完成这个?

处理密码重置最安全的方法很可能是使用重置令牌。每当用户请求重置密码时,您都会创建一个新令牌,该令牌的有效期可能为 15 分钟或直到使用为止。然后,您将 link 发送到用户的电子邮件,其中包含看起来像 website.tld/reset?user=username&token=aRandomToken 的 url。在重置页面上,用户可以选择一个新密码。这样,您就不必创建以纯文本形式发送给用户的随机密码。一种更安全的方法是对用户进行哈希处理,因此 user 参数将是一个哈希值,然后用户必须在重置页面上输入他们的用户名。这样,具有 link 的黑客就不能只查看 url,而实际上需要知道用户名。

为方便起见,实现可能类似于:

var reset = new PasswordReset;
reset.user = realUsername;
reset.token = md5(randString(5) + date('Y-m-d H:i:s');
reset.save();

var url = 'website.tld/reset?user=' + md5(realUsername) + '&token=' + reset.token;

// send an email to the user with the url