重设密码--邮箱重设(整理)

业务

  用户忘记密码了,通过输入之前注册的邮件,我们向用户的邮箱发一个链接以重设密码。

用户流程:
  1. 用户忘记密码,来到密码重设界面
  2. 用户输入Email地址(可以在发邮件之前先验证邮箱是否注册),点击重设密码按钮
  3. 用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间
  4. 用户点击链接,来到密码重设页面,输入新密码,完成
    这个流程并没有什么创新,很多网站都是用这套流程
后端实现方式:
  1. 当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的user_id
  2. 将user_id和当前时间戳编码成HASH,需要提前准备好一个KEY,并且这个KEY只存在服务器上。 HASH = md5 ( user_id + timestamp + KEY )
  3. 生成一个URL,并且附带刚刚生成的HASH和用户id以及timestamp,比如 http://domain.com/reset-password.php?hash=HASH&user_id=123&timestamp=1392121211

  4. 当用户访问这个URL, 检查HASH是否合法: HASH == MD5 ( user_id + timestamp + KEY)

    1. 还要注意邮件中的链接可能被邮箱服务商扫描,因此需要结合用户的其它信息(cookies或者ip地址)加以确认。
    
    2. 防范蓄意破坏仍然十分重要,要避免反复发送邮件、短信;也要避免破坏者重设密码,结合邮件链接的问题,千万不要直接通过点击链接随机修改密码。
    
  5. 检查 timestamp 是不是过期了

  6. 如果所有检查通过,那么显示一个新密码表单给用户

这种方式的好处:

  1. 不需要额外的数据表
  2. 不用担心参数被用户恶意修改,因为要检查hash是不是等于那几个参数的md5
  3. 密码重设URL自带时间戳
  4. 只要KEY设置的足够长足够复杂,那么可以认为HASH是绝对安全的