生成密码重置的密码

时间:2010-08-24 15:47:02

标签: php hash otp

我正在做一个允许用户重置密码的模块。我注意到大多数网站如何提供包含具有唯一哈希的查询字符串的确认链接。

我的问题是:每次相同的用户请求忘记密码时,如何生成此唯一哈希?我应该将此哈希存储在数据库中并在以后使用它进行验证吗?它会安全吗?或者我应该创建一些生成一次性密码的算法?如何生成OTP?

4 个答案:

答案 0 :(得分:27)

是的,你应该

  1. 生成随机重置令牌。参见例如this answer
  2. 将其存储在数据库中(可能有到期时间)
  3. 使用重置令牌向用户发送电子邮件。
  4. 用户使用查询字符串中的重置令牌访问重置密码页面。
  5. 检查数据库以查看与重置令牌关联的用户以及是否尚未过期。
  6. 如果所有内容都已检出,请允许用户重置密码并从数据库中删除重置令牌。
  7. 关于重置令牌的生成(或者你想要的任何调用令牌)似乎有很多混乱。请阅读我所链接的答案,不要用哈希和弱种子重新发明轮子。

答案 1 :(得分:3)

只是使用一些带有用户ID的哈希函数,用户的盐(你用户的密码,对吗?)和伪随机数据应该没问题:

$pwd_reset_hash = hash ( 'sha256' , $user_id . $user_salt, uniqid("",true));

将其存储在数据库中(连同请求时间)作为此用户的重置键

 user_id  pwd_reset_hash  time_requested  
===========================================  
 123      ae12a45232...   2010-08-24 18:05

当用户尝试使用它时,请检查哈希是否与用户匹配,以及时间是否是最近的(例如“重置代码有效3小时”或类似内容)

在使用或过期时从数据库中删除

答案 2 :(得分:1)

要走的路确实会生成某种随机的东西并将其存储在数据库中。更改密码后,您将从表中删除相关记录,以便无法再次使用该链接。

  • 将网址邮寄给用户,包括“令牌”。
  • 如果访问了该链接,请检查该令牌是否存在,允许用户更改密码
  • 从数据库中删除令牌。

正如在其他回复中已经说过的那样,做一个用户ID的SHA1或MD5,加上microtime和一些盐串通常是一个安全的赌注。

答案 3 :(得分:0)

1)要生成唯一的哈希,请混合当前时间,用户ID和一些盐(文本)。例如,如果您的网站是mysite.com,请使用以下代码:

 $hash = md5(time() . $userid . 'mysite');

这将创建一个很好的哈希。

2)是的,将其存储在数据库中 3)是的,只要你在一段固定的时间后使哈希到期,它就会安全 4)不,生成一次性密码通常会使用户烦恼。