[转载]找回密码的功能设计

转载自阮一峰的网络博客:http://www.ruanyifeng.com/blog/2019/02/password.html
所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。

image

正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南

一、如何保存密码

一个网站要想保证密码安全,第一步就是以正确的方法保存密码。一般说来,密码有三种保存方式。

(1)明文保存

"明文保存"就是用户的密码原文不动地写入数据库。这种方式最不安全,极易泄漏,应该严格禁用。

(2)加密保存

"加密保存"就是使用密钥,将密码加密后,以密文保存进数据库。这种方式虽然有一定的安全性,但是终究还是可以用密钥还原密码。因此,还是存在泄漏的可能,也不推荐使用。

(3)哈希保存

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

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

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

二、密码重置

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

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

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

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

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

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

重置密码之前,必须知道重置谁的密码。这时需要用户提供,注册时的邮件地址。

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

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

image

正确的做法是,不管用户输入什么邮箱,都向该邮箱发邮件。在邮件里说明,有人尝试重置密码,但是他输入的邮箱不在数据库里面。

image

如果不是采用邮件地址,而是根据用户名识别用户,就没有办法不提示,某个用户名是否存在。某些人的用户名非常特殊,一旦知道该用户名存在,就几乎可以肯定是该人注册的。

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

四、过滤用户

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

image

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

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

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

image

(完)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 正确设计这个功能,保证安全可靠,并不简单。下面就是安全专家 Troy Hunt 给出的设计指南。 第一条规则:密码...
    VeC_House阅读 1,491评论 0 0
  • 第二部分 Blog例子 第八章 用户验证 大部分程序需要追踪用户身份。当用户连接到程序,通过一系列步骤使自己的身份...
    易木成华阅读 1,329评论 0 4
  • 4 创建一个社交网站 在上一章中,你学习了如何创建站点地图和订阅,并且为博客应用构建了一个搜索引擎。在这一章中,你...
    lakerszhy阅读 2,216评论 0 7
  • 路在脚下、却也无定、 人在心上、却也无常、 明日能几时休、何时添几丈前、 路虽漫、却也能行、 描古往、指今朝、思明...
    青山撩丝寄风华阅读 245评论 0 0
  • 这几天成都的阳光真不错!虽然风能把耳朵冷掉(不能和北方地区比较),但是阳光下还是很舒服!熊孩子这几天很给力,...
    双鱼座晴天妈妈阅读 402评论 4 8