[阮一峰]找回密码的功能设计(代码片段)

jinanxiaolaohu jinanxiaolaohu     2023-03-05     224

关键词:

找回密码的功能设计

作者: 阮一峰

日期: 2019年2月 7日

技术图片

所有需要登录的网站,都会提供"找回密码"的功能,防止用户忘记密码。

技术图片

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

一、如何保存密码

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

(1)明文保存

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

(2)加密保存

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

(3)哈希保存

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

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

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

二、密码重置

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

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

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

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

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

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

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

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

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

技术图片

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

技术图片

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

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

四、过滤用户

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

技术图片

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

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

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

技术图片

(完)

阮一峰:网页性能管理详解(转)(代码片段)

你遇到过性能很差的网页吗?  这种网页响应非常缓慢,占用大量的CPU和内存,浏览起来常常有卡顿,页面的动画效果也不流畅。  你会有什么反应?我猜想,大多数用户会关闭这个页面,改为访问其他网站。作为一个开发... 查看详情

阮一峰老师的es6入门:async函数(代码片段)

async函数1.含义ES2017标准引入了async函数,使得异步操作变得更加方便。async函数是什么?一句话,它就是Generator函数的语法糖。前文有一个Generator函数,依次读取两个文件。constfs=require(‘fs‘);constreadFile=function(fileName)returnnewPromis... 查看详情

找回密码功能设计

...台,用户自主注册难免会有用户忘记密码,因此需要提供找回密码功能。本方案是通过邮箱找回密码。 需要的表结构找回密码表(FindPwdRecord):字段名类型描述备注IDstring主键 UserIDstring用户ID UserNamestring用户名 To... 查看详情

flex布局(引用阮一峰老师的flex布局-语法篇)(代码片段)

一、Flex布局是什么?Flex是FlexibleBox的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。.boxdisplay:flex;行内元素也可以使用Flex布局。.boxdisplay:inline-flex;Webkit内核的浏览器,必须加上-w... 查看详情

阮一峰react-demo(代码片段)

1)<scriptsrc="../build/react.development.js"></script><scriptsrc="../build/react-dom.development.js"></script><scriptsrc="../build/babel.min.js"></script>ReactDOM.r 查看详情

阮一峰老师的es6入门:变量的解构赋值(代码片段)

变量的解构赋值数组的解构赋值对象的解构赋值字符串的解构赋值数值和布尔值的解构赋值函数参数的解构赋值圆括号问题用途数组的解构赋值基本用法ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为... 查看详情

理解oauth2.0-阮一峰的网络日志

原文:理解OAuth2.0-阮一峰的网络日志理解OAuth2.0作者:阮一峰日期:2014年5月12日 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。本文对OAuth2.0的设计思路和运行流程,做一个简... 查看详情

《es6标准入门》(阮一峰)--15.reflect(代码片段)

1.概述Reflect对象与Proxy对象一样,也是ES6为了操作对象而提供的新API。Reflect对象的设计目的有这样几个。(1)将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Obje... 查看详情

好文种草根域名的知识-阮一峰的网络日志(代码片段)

域名是互联网的基础设施,只要上网就会用到。它还是一门利润丰厚的生意,所有域名每年都必须交注册费,这是很大的一笔钱。这些钱交到了哪里?到底谁控制域名的价格?为什么有的域名注册费很贵,... 查看详情

阮一峰老师的javascript标准参考教程:object对象和object方法(代码片段)

Object对象1.概述1.1生成方法对象(object)是JavaScript语言的核心概念,也是最重要的数据类型。什么是对象?简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合。varobj=foo:‘Hello‘,bar:‘World‘;... 查看详情

阮一峰flex布局教程:语法篇(代码片段)

网页布局(layout)是CSS的一个重点应用。布局的传统解决方案,基于盒状模型,依赖 display 属性+ position属性+ float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。2009年,W3C提出了一种新的... 查看详情

webpack——阮一峰webpackdemo分析(代码片段)

 首先上交阮一峰老师的github地址,一共有15个demo,我们一个一个的进行分析,结合上文所学的知识!其中有一些内容,我做了修改,我是先看一遍然后从新敲了一遍。https://github.com/ruanyf/webpack-demos 准备工作首先还是安装,... 查看详情

找回密码(代码片段)

登陆功能中有一项是当用户忘记密码后需要找回密码1、当用户点忘记密码后我们呈现的是一个表单,要求用户输入用户名和邮箱号,输完信息后点击发送邮件,发邮件的代码如下:publicstringSendMail(stringuserid,stringemail)if(string.IsNull... 查看详情

django开发忘记密码通过邮箱找回功能(代码片段)

一、流程分析:1.点击忘记密码====》forget.html页面,输入邮箱和验证码,发送验证链接网址的邮件====》发送成功,跳到send_success.html提示2.到邮箱里找到验证链接网址,访问重设密码网址reset.html===》重设密码提交数据,成功则返... 查看详情

阮一峰老师的javascript标准参考教程:数组array对象和array对象方法(代码片段)

数组1.定义数组(array)是按次序排列的一组值。每个值的位置都有编号(从0开始),整个数组用方括号表示。vararr=[‘a‘,‘b‘,‘c‘];上面代码中的a、b、c就构成一个数组,两端的方括号是数组的标志。a是0号位置,b是1号位置... 查看详情

鸿蒙鸿蒙app应用-《记账软件》登录,注册,找回密码功能(代码片段)

1.登录功能从【鸿蒙】鸿蒙App应用-《记账软件》开发步骤欢迎引导页进入之后,完成登录功能。界面效果如图2.布局文件的搭建在layout文件夹下新建xml文件,布局代码如下:<?xmlversion="1.0"encoding="utf-8"?>... 查看详情

flex实例(阮一峰)

Flex布局教程:实例篇 作者: 阮一峰日期: 2015年7月14日上一篇文章介绍了Flex布局的语法,今天介绍常见布局的Flex写法。你会看到,不管是什么布局,Flex往往都可以几行命令搞定。我只列出代码,详细的语法解释请... 查看详情

27理解js的继承机制(转载自阮一峰)

Javascript继承机制的设计思想 作者: 阮一峰日期: 2011年6月5日我一直很难理解Javascript语言的继承机制。它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototyp... 查看详情