业余草双因素认证(2FA)教程

简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xmt1139057136/article/details/78422231 所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xmt1139057136/article/details/78422231
所谓认证(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.comifxvn.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.comifxvn.com

参考链接

原文链接: http://www.ruanyifeng.com/blog/2017/11/2fa-tutorial.html
目录
相关文章
|
3月前
|
安全 中间件 区块链
BRC-20铭文系统开发详细教程/步骤方案/需求设计/规则玩法/源码程序
中间件技术:使用中间件技术可以简化BRC20铭文智能合约跨链系统的开发过程。中间件提供了一些常用功能的封装,例如处理网络通信、
|
7月前
|
监控 项目管理
PMP考试精要:深入解析5大过程组
在职场中,项目管理是一项至关重要的技能。无论您是初入职场的新手还是经验丰富的专业人士,PMP(项目管理专业认证)都是您提升职业发展的关键一步。PMP考试要求考生掌握五大过程组,这些过程组在项目管理中起着关键作用。本文将深入探讨PMP考试中的五大过程组,帮助您更好地理解它们的重要性。
|
9月前
2020第三场 NOI Online 能力测试入门组试题
2020第三场 NOI Online 能力测试入门组试题
|
9月前
|
前端开发 JavaScript 程序员
5 个网站将您的前端技能提升100倍
5 个网站将您的前端技能提升100倍
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
115 0
计算机高职专业VB知识要点001,模拟域名抢购软件案例代码开源,热身第一课
|
云安全 存储 Cloud Native
怎么样能顺利通过阿里云ACE考试?难度是不是很大?
阿里云认证是现在IT行业内广受认可的一个认证,其中难度最高的就是ACE考试,很大人都会选择考这个这个来提升自己的就业竞争力,但是自从ACE改版之后,难度大大增加,考试的内容和形式很多人都不了解。
487 1
怎么样能顺利通过阿里云ACE考试?难度是不是很大?
|
容灾 数据库 数据安全/隐私保护
软件评测师笔记(十一)—— 可靠性测试相关
软件评测师笔记(十一)—— 可靠性测试相关
214 0
软件评测师笔记(十一)—— 可靠性测试相关
|
云安全 存储 弹性计算
阿里云ace考试有什么用?想要通过需要掌握哪些方面知识?
阿里云公司作为阿里巴巴集团旗下的互联网公司,非常的知名,很多互联网从业人员都想要进入阿里云。通过了阿里云ace考试,获得了阿里云ace认证,就获得了阿里云公司的通行证。那么,阿里云ace考试有什么用?想要通过需要掌握哪些方面知识?
445 1
阿里云ace考试有什么用?想要通过需要掌握哪些方面知识?
|
运维 算法 网络协议
Elastic 认证工程师考试最常被问到 Top10 +问题集锦
关于 Elastic 认证考试,官方文档已经提供了详尽的 Elastic Certification FAQ, 详细地址:https://www.elastic.co/cn/training/certification/faq 近一年,有以下 Elastic 认证相关问题经常被问到。特整理出来,希望对更多需要认证考试的朋友有所帮助。 1、英语不ok,可以参加 Elastic 认证考试吗? 考试的时候可以使用谷歌翻译。 以下是一位通过朋友的最新(2020-06-09)反馈:
240 0
|
存储 云安全 数据可视化
获得阿里Aca认证能够提高应聘成功几率
获得阿里Aca认证能够提高应聘成功几率,现在你去一些互联网企业招聘,往往别人都会在招聘栏中写明了自己需要的员工具备什么能力,要是你有这方面的证书,那么企业肯定是会给机会你去面试的,而阿里Aca认证在行业内也是被不少企业认可的,能够通过学习面向使用阿里云大数据产品,那么你在这个行业也算是入门了,所以你也有机会冲击高薪,毕竟计算机行业的薪酬还是很不错的。
169 0
获得阿里Aca认证能够提高应聘成功几率