Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 遗忘密码——一个只能使用一次但不是';t存储_Security_Authentication - Fatal编程技术网

Security 遗忘密码——一个只能使用一次但不是';t存储

Security 遗忘密码——一个只能使用一次但不是';t存储,security,authentication,Security,Authentication,这是一个关于为用户生成令牌以重置其密码的问题,而无需将所述令牌存储在数据库中。此令牌将是通过电子邮件发送的“重置密码”URL的一部分 说明可以向用户发送包含以下信息的令牌 name expiration date hash(secret + user name + expiration date) 此方法的问题在于,用户可以在令牌过期之前多次更改其密码。我认为这很糟糕,因为这意味着如果用户从保留历史记录的共享计算机访问URL,任何人都可以重置用户的密码(即使只是在有限的时间内) 所以我的问题是

这是一个关于为用户生成令牌以重置其密码的问题,而无需将所述令牌存储在数据库中。此令牌将是通过电子邮件发送的“重置密码”URL的一部分

说明可以向用户发送包含以下信息的令牌

name
expiration date
hash(secret + user name + expiration date)
此方法的问题在于,用户可以在令牌过期之前多次更改其密码。我认为这很糟糕,因为这意味着如果用户从保留历史记录的共享计算机访问URL,任何人都可以重置用户的密码(即使只是在有限的时间内)


所以我的问题是:是否可能有一个只可用一次的令牌,而该令牌不存储在数据库中?

一个可能的解决方案是使用一个稍微不同的令牌:

user name
expiration date
hash(secret + user name + password_hash + expiration date)
当用户第一次访问密码重置页面时,您可以从数据库中检索他的密码哈希,并检查哈希。如果匹配,用户可以重置其密码

当用户使用同一链接第二次访问密码重置页面时,它将不起作用:密码\u哈希已更改,因此哈希将不匹配


但是。。。。如果用户实际键入其原始密码,则会出现问题。在这种情况下,密码\u散列将保持不变,令牌将保持有效。由于这种边缘情况,此解决方案实际上不可行。

是的。获取一次性使用令牌的一种简单方法是将用户管理转移到一个微服务上,比如它为您处理所有用户管理——密码重置、密码存储、用户配置文件、身份验证等

对于密码重置,下面是它的外观:

  • 用户在网页上启动密码重置工作
  • 您使用用户的电子邮件地址或用户名对stormpath进行API调用
  • Stormpath使用链接+令牌向用户(您的“发件人”地址、自定义HTML等)发送重置电子邮件。唯一的、一次性使用的重置令牌,如果在24小时内未使用,将过期
  • 用户单击链接并进入重置页面
  • 从URL中提取令牌并检查Stormpath以进行令牌验证
  • 用户提交新密码
  • Stormpath发送重置成功消息(您的“发件人”地址、自定义HTML等)
  • 您可以在此流程中构建自己的UI,也可以使用Stormpath包含的现成的定制id站点(id.mydomain.com)

    用户永远不知道Stormpath存在,您不必管理或存储任何密码或重置令牌


    充分披露-我的工作很有趣,也回答了这个问题,尽管绝对不是以我期望的方式!