2015-11-02 67 views
0

我正在开发一个应用程序,将允许用户存储和加密信息,其中一些可能是敏感的。最近问题出现了“如果用户丢失密码怎么办?”目前无法在此应用程序中恢复丢失的密码。我想避免让应用程序发送任何信息给我的服务器以解决隐私问题。我想可能会设置一种方法,通过在用户通过电子邮件请求的用户名和密码字段中添加特定短语来重置登录信息。但是我不确定这是否是一个好主意。有更好的方法来完成这个吗?安全的方法来重置登录帐户

+0

你为什么不发一个临时密码,给用户的电子邮件? –

回答

1

最安全的方式来处理密码重置很可能使用重置令牌。每当用户请求重置密码时,您都会创建一个有效时间为15分钟或直至使用的新令牌。然后,您将链接发送到用户的电子邮件,其链接看起来像website.tld/reset?user=username&token=aRandomToken。在重置页面上,用户可以选择一个新的密码。这样,您就不必处理创建以纯文本向用户发送的随机密码。更安全的方法是散列用户,因此参数user将是散列,然后用户必须在重置页面上输入其用户名。这样,带链接的黑客就不能只看网址,但实际上需要知道用户名。

为了方便起见,实现可能看起来像:

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 
+0

谢谢您的输入Phroggyy。这听起来像我有很多工作在我面前。就这样,我知道如果我得到了这个理想的逻辑是正确的。在设备上,我会散列用户名:然后如果用户忘记密码,则散列用户名将被发送到网页进行检查。该网页要求提供用户名,将其散列,然后检查以查看散列是否匹配?如果匹配,用户将获得将解锁应用程序的重置令牌。我错过了什么吗? –

+0

我不明白你为什么要散列用户名的客户端。基本上,用户在请求重置密码时输入用户名,然后生成前面描述的表单的URL,其中'user'参数是哈希用户名。然后让用户在恢复时再次输入用户名,然后检查URL中的哈希值是否与哈希用户名 – Phroggyy

+0

相匹配我在考虑为了使程序和网站具有相同的哈希值,客户第一。显然情况并非如此。我会继续前进,并将其标记为已回答,但似乎我有一些研究工作要做。 –