代码之家  ›  专栏  ›  技术社区  ›  chrizonline

生成密码重置的密码

  •  12
  • chrizonline  · 技术社区  · 16 年前

    我正在做一个允许用户重置密码的模块。我注意到大多数网站都提供了一个确认链接,其中包含具有唯一散列的查询字符串。

    我的问题是:每次同一个用户请求忘记密码时,我如何生成这个唯一的散列?我是否应该将这个散列存储在数据库中,并在以后使用它进行验证?会不会安全?还是应该创建某种生成一次性密码的算法?如何生成OTP?

    4 回复  |  直到 6 年前
        1
  •  28
  •   Community Mohan Dere    9 年前

    是的,你应该

    1. 生成随机重置令牌。参见例如。 this answer .
    2. 将其存储在数据库中(可能有到期时间)
    3. 用户使用查询字符串中的重置令牌访问重置密码页。
    4. 检查数据库以查看与重置令牌相关联的用户以及是否已过过期时间。
    5. 如果所有内容都签出,则允许用户重置密码并从数据库中删除重置令牌。

        2
  •  3
  •   Piskvor left the building Rohit Kumar    16 年前

    $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
  •  1
  •   Blizz    16 年前

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

    正如在其他回答中所说的,对用户id进行SHA1或MD5操作,结合使用microtime和一些salt字符串通常是安全的。

        4
  •  0
  •   shamittomar    16 年前

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

    2) 是的,存储在数据库中。

    4) 不,生成一次性密码通常会惹恼用户。