Security 遗忘密码——一个只能使用一次但不是';t存储
这是一个关于为用户生成令牌以重置其密码的问题,而无需将所述令牌存储在数据库中。此令牌将是通过电子邮件发送的“重置密码”URL的一部分 说明可以向用户发送包含以下信息的令牌Security 遗忘密码——一个只能使用一次但不是';t存储,security,authentication,Security,Authentication,这是一个关于为用户生成令牌以重置其密码的问题,而无需将所述令牌存储在数据库中。此令牌将是通过电子邮件发送的“重置密码”URL的一部分 说明可以向用户发送包含以下信息的令牌 name expiration date hash(secret + user name + expiration date) 此方法的问题在于,用户可以在令牌过期之前多次更改其密码。我认为这很糟糕,因为这意味着如果用户从保留历史记录的共享计算机访问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散列将保持不变,令牌将保持有效。由于这种边缘情况,此解决方案实际上不可行。是的。获取一次性使用令牌的一种简单方法是将用户管理转移到一个微服务上,比如它为您处理所有用户管理——密码重置、密码存储、用户配置文件、身份验证等 对于密码重置,下面是它的外观:
充分披露-我的工作很有趣,也回答了这个问题,尽管绝对不是以我期望的方式!