找回密码的功能设计规则

一、如何保存密码

第一条规则:密码永远都要哈希保存。

  ”哈希保存”就是对密码使用哈希算法,将哈希值保存进数据库。为了增加随机性,防止彩虹表这一类的工具,计算哈希的时候,每个用户都有一个不一样的盐值(salt),也会同时保存进数据库。

  哈希是单向运算,无法还原,所以即使哈希值泄漏,一般来说,也不会暴露用户的原始密码。

二、密码重置

  如果密码是哈希保存,用户一旦忘记密码,网站也无法知道原始密码是什么,只能让用户重置密码。

第二条规则:找回密码就是让用户重置密码。

  重置密码又有两种做法。有的网站先自动改成一个随机密码,然后再让用户登录后自己改掉。这样做的风险在于,你必须把随机密码告知用户,通过邮件或短信,这个过程中就有可能泄漏。

第三条规则:重置密码的时候,要给出一个链接,让用户到网页上自己修改密码。

  重置链接由于是明文传播,而且直接修改密码,所以必须有失效时间。一般来说,可以设成10分钟失效。

三、用户名还是邮件地址?

第四条规则:重置密码之前,如果用户提供了错误的邮件地址,不要提示他。

  这是因为如果提示了,数据库不包含某个邮件地址,就可能泄露用户的隐私,被钓鱼者利用。

第五条规则:重置密码的时候,识别用户最好依靠邮件地址,而不是用户名。

四、过滤用户

  为了防止机器人攻击,进入重置密码之前,最好加上 CAPTCHA 识别。

  此外,还要防止一种情况:张三知道李四的邮箱,然后使用找回密码功能,让系统给李四发出重置密码的邮件。

第六条规则:如果条件允许,重置密码之前,最好请用户回答一些个人问题,或者采用 2FA 验证,比如短信验证码。

  最后,不要忘了记录 IP 地址,在邮件里面告诉用户,哪个 IP 地址在申请重置你的密码。

原文