业余草双因素认证(2FA)教程
所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。
密码是最常见的认证方法,但是不安全,容易泄露和冒充。
越来越多的地方,要求启用双因素认证(Two-factor authentication,简称 2FA)。本文介绍它的概念和实现方法。
我的博客: CODE大全 : www.codedq.net ; 业余草 : www.xttblog.com ; 爱分享 : www.ndislwf.com 或 ifxvn.com 。
双因素认证的概念
一般来说,三种不同类型的证据,可以证明一个人的身份。
- 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。
- 个人物品:该用户的私人物品,比如身份证、钥匙。
- 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。
这些证据就称为三种"因素"(factor)。因素越多,证明力就越强,身份就越可靠。
双因素认证就是指,通过认证同时需要两个因素的证据。
银行卡就是最常见的双因素认证。用户必须同时提供银行卡和密码,才能取到现金。
双因素认证方案
常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行。
但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。
国内的很多网站要求,用户输入密码时,还要提供短消息发送的验证码,以证明用户确实拥有该手机。
但是,短消息是不安全的,容易被拦截和伪造,SIM 卡也可以克隆。已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
因此,安全的双因素认证不是密码 + 短消息,而是下面要介绍的 TOTP。
TOTP 的概念
TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password)。它是公认的可靠解决方案,已经写入国际标准 RFC6238。
它的步骤如下。
第一步,用户开启双因素认证后,服务器生成一个密钥。
第二步:服务器提示用户扫描二维码(或者使用其他方式),把密钥保存到用户的手机。也就是说,服务器和用户的手机,现在都有了同一把密钥。
注意,密钥必须跟手机绑定。一旦用户更换手机,就必须生成全新的密钥。
第三步,用户登录时,手机客户端使用这个密钥和当前时间戳,生成一个哈希,有效期默认为30秒。用户在有效期内,把这个哈希提交给服务器。
第四步,服务器也使用密钥和当前时间戳,生成一个哈希,跟用户提交的哈希比对。只要两者不一致,就拒绝登录。
我的博客:CODE大全:www.codedq.net;业余草:www.xttblog.com;爱分享:www.ndislwf.com或ifxvn.com。
TOTP 的算法
仔细看上面的步骤,你可能会有一个问题:手机客户端和服务器,如何保证30秒期间都得到同一个哈希呢?
答案就是下面的公式。
TC = floor((unixtime(now) − unixtime(T0)) / TS)
上面的公式中,TC 表示一个时间计数器,unixtime(now)是当前 Unix 时间戳,unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1月1日。TS 则是哈希有效期的时间长度,默认是30秒。因此,上面的公式就变成下面的形式。
TC = floor(unixtime(now) / 30)
所以,只要在 30 秒以内,TC 的值都是一样的。前提是服务器和手机的时间必须同步。
接下来,就可以算出哈希了。
TOTP = HASH(SecretKey, TC)
上面代码中,HASH就是约定的哈希函数,默认是 SHA-1。
TOTP 有硬件生成器和软件生成器之分,都是采用上面的算法。
(说明:TOTP 硬件生成器)
(说明:Google Authenticator 是一个生成 TOTP 的手机 App)
TOTP 的实现
TOTP 很容易写,各个语言都有实现。下面我用 JavaScript 实现2fa来演示一下真实代码。
首先,安装这个模块。
$ npm install --save 2fa
然后,生成一个32位字符的密钥。
var tfa = require('2fa');tfa.generateKey(32, function(err, key) {console.log(key);
});
// b5jjo0cz87d66mhwa9azplhxiao18zlx
现在就可以生成哈希了。
var tc = Math.floor(Date.now() / 1000 / 30);
var totp = tfa.generateCode(key, tc);
console.log(totp); // 683464
总结
双因素认证的优点在于,比单纯的密码登录安全得多。就算密码泄露,只要手机还在,账户就是安全的。各种密码破解方法,都对双因素认证无效。
缺点在于,登录多了一步,费时且麻烦,用户会感到不耐烦。而且,它也不意味着账户的绝对安全,入侵者依然可以通过盗取 cookie 或 token,劫持整个对话(session)。
双因素认证还有一个最大的问题,那就是帐户的恢复。
一旦忘记密码或者遗失手机,想要恢复登录,势必就要绕过双因素认证,这就形成了一个安全漏洞。除非准备两套双因素认证,一套用来登录,另一套用来恢复账户。
我的博客:CODE大全:www.codedq.net;业余草:www.xttblog.com;爱分享:www.ndislwf.com或ifxvn.com。
参考链接
- Multi-factor authentication, by Wikipedia
- Time-based One-time Password Algorithm, by Wikipedia
- Enabling Two-Factor Authentication For Your Web Application, by Bozhidar Bozhanov
- simontabor/2fa, by Simon Tabor
- 双因素认证(2FA)的概念
- 双因素认证(2FA)认证方案
原文链接: http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html
业余草双因素认证(2FA)教程相关推荐
- 双因素认证(2FA)工作原理简介
什么是双因素认证(Two-factor authentication,简称 2FA) 双因素身份认证就是:通过你所知道再加上你所能拥有的,这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一 ...
- 3天时间,如何用双因素认证帮5000名员工实现远程办公账号安全
远程办公最早在上世纪80年代的硅谷流行.在疫情仍在全球肆虐的当下,远程办公方式受到众多企业的推崇.对于一些集团化或多分支机构的企业组织,员工通过VPN.云桌面.虚拟化桌面等方式远程访问总部内网资源已成 ...
- 双因素认证(2FA)教程
所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤. 密码是最常见的认证方法,但是不安全,容易泄露和冒充. 越来越多的地方,要求启用双因素认证(Two-factor ...
- 双因素认证(2FA)
转自: http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html 所谓认证(authentication)就是确认用户的身份,是网站登录必不可 ...
- 关于双因素认证(2FA),这些基础知识你一定要知道
如今,在线时间占据了生活的一大部分.远程工作.社交媒体人气的激增以及元宇宙的出现意味着如今的数字身份与现实身份一样重要,而维护数字身份安全也变得更加重要. 双因素认证(2FA)作为额外安全层为账号登录 ...
- 【IoT】加密与安全:双因素认证(2FA):TOTP
认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤.密码是最常见的认证方法,但是不安全,容易泄露和冒充. 基于安全认证,很多场景要求启用双因素认证(Two-factor ...
- 九州云腾双因素认证系统_“等保2.0”新标准落地 双因子认证(2FA)成标配...
2019年5月13日,国家标准新闻发布会正式发布网络安全等级保护制度2.0标准(以下简称"等保2.0"),新标准将于2019年12月1日开始实施,这意味着"等保2.0&q ...
- ASP.NET Core 双因素验证2FA 实战经验分享
必读 本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明. 为了防止不提供原网址的转载,特在这里加上原文链接: 双因素认证 双因 ...
- GitHub 再次呼吁用户采取双因素认证机制
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 软件仓库平台 GitHub 再次鼓励用户启用双因素 (2FA) 认证机制,更好地保护账户安全. GitHub 支持2FA 机制已有8年的时间,目 ...
最新文章
- 概率论中指数分布介绍及C++11中std::exponential_distribution的使用
- 【Groovy基础系列】 Groovy运算符
- zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
- Single-Shot Object Detection with Enriched Semantics
- 怎样编写一个Photoshop滤镜(1)
- Apache Ant使用过程的总结
- Redis主从、哨兵模式的搭建
- span标签的鼠标滑入提示_彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽...
- PHP Checkbox获取选中项与
- cvMat结构体详解
- java PDF添加水印效果
- Word2Vec模型详解
- JavaScript的toast
- html 中图片显示不了,css中不显示图片怎么办
- PS新手教程,教你打造一个炫酷的冰冻字效_桂桂博客
- CSDN如何获取积分(转载)
- 数学形态学之腐蚀算法
- 计算机电池维修方案,解决方案:计算机主板电池已耗尽,如果不更换电池该怎么办?如何更换电池...
- uniapp App端 实现pdf文件预览
- 考研:研究生考试(五天学完)之《线性代数与空间解析几何》研究生学霸重点知识点总结之第三课向量与向量空间
热门文章
- Accelerated Proximal Gradient Method/FISTA
- java容器之Map
- Mac 和 iPad 产品线要合并?苹果高管回应了
- 事物(Transaction)
- 【Antv g6】react hook下的useEffect执行初始化渲染 图表渲染了2次的原因及解决办法
- java clh_Java多线程编程CLH锁详解
- aqs clh java_并发编程——详解 AQS CLH 锁
- 身家破亿!86版「红孩儿」拒绝出道成学霸,已是中科院博士,名下52家公司
- 标准库之正则表达式3-前后向管理
- 【SQL】大数据面试常考题之日活(dau)月活