Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >双因素认证(2FA)原理介绍及实现

双因素认证(2FA)原理介绍及实现

作者头像
鳄鱼儿
发布于 2024-05-21 08:34:38
发布于 2024-05-21 08:34:38
2K00
代码可运行
举报
运行总次数:0
代码可运行

😀 我们常说的认证(authentication)就是在确认用户的身份,是在进行重要操作时的必要手段,譬如网站登录、银行取现等。

使用密码是生活中最常见的认证手段,但是密码是单一因素,不安全,并且很容易被泄露和冒充。今天我们来学习一种更安全的认证方式——双因素认证

双因素认证的概念

双因素认证(Two-factor authentication,简称 2FA),想要了解2FA,我们首先要知道双因素是指什么。

这里的因素是指证明一个人身份的证据,一般来说可以被分为三种证据。

  • 秘密信息:只有该用户知道、其他人不知道的某种信息,比如密码。
  • 个人物品:该用户的私人物品,比如身份证、钥匙。
  • 生理特征:该用户的遗传特征,比如指纹、相貌、虹膜等等。

认证时使用因素越多,越能证明这个人的身份,身份也就越可靠。

回到我们今天所说的「双因素认证」,就能很清晰地明白含义了,即认证时需要同时两个因素的证据才能通过。譬如:银行卡就是生活中最常见的双因素认证。用户必须同时提供银行卡和密码,才能在ATM取出现金。

双因素认证的设计

常用的双因素组合是密码 + 某种个人物品,比如网上银行的 U 盾。用户插上 U 盾,再输入密码,才能登录网上银行(现在几乎不再使用 U 盾了,U 盾实物见下图)。

但是,用户不可能随时携带 U 盾,手机才是最好的替代品。密码 + 手机就成了最佳的双因素认证方案。很多网站也有这样的要求,在登录账户时,用户通过账号密码登录后,仍需要提供短信发送的验证码,以证明用户确实拥有该手机。

但是,短信是不安全的,通过伪基站就很容易将消息拦截或伪造,同时 SIM 卡也可以被补办。早些时候,凭借身份证就可以补办手机号,犯罪分子会先伪造身份证,再去补办一张户主的手机号码,通过该手机接收验证码,通过验证码认证将钱转走。

由此用短信作为补充因素的双因素认证是相当不可靠的,而我们今天要说的是 TOTP

TOTP 介绍

TOTP 全称为"基于时间的一次性密码"(Time-based One-time Password)。它是国际上公认的可靠解决方案,已经写入国际标准 RFC6238

TOTP的计算步骤:

  1. 用户在安全设置中开启双因素认证,服务器生成一个密钥,可能是二维码的形式(二维码的主要内容就是这个密钥)。
  2. 需要用户记录这个密钥,譬如通过TOTP软件扫描二维码(或者使用其他方式),把密钥保存到用户手机中。这时候,服务器和用户手机中都保存了这个密钥,后面做验证就是基于这个密钥去完成。
  3. 在用户登录时需要输入TOTP的动态验证码,这时手机中TOTP软件生成器就会使用这个密钥和当前时间戳去生成一个哈希,一般有效期为30秒。在这个有效期内,用户都可以使用这个哈希验证码,并将其提交给服务器。
  4. 服务器验证这个哈希验证码,这时候会使用密钥和当前时间戳,生成一个哈希验证码,并与用户提交的哈希验证码进行对比。两者一致才能通过认证。

TOTP 算法

通过TOTP的计算步骤,我们得知了哈希验证码只有30秒有效期,那么手机如何与服务器保持一致呢?

我们可以想到,只要手机和服务器共同维护一个时间计数器,那么在同样的时间计数下,得到的哈希验证码就是一致的。

那么在手机和服务器中如何维持同一个时间计数器呢?接着往下看

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TC = floor((unixtime(now)unixtime(T0)) / TS)

在这个公式中,TC 表示一个时间计数器,unixtime(now)是当前 Unix 时间戳(从1970年1月1日开始的计数),unixtime(T0)是约定的起始时间点的时间戳,默认是0,也就是1970年1月1日。TS 则是哈希有效期的时间长度,默认是30秒。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TC = floor(unixtime(now) / 30)

由此,只要服务器和手机的时间是同步的,则在这 30 秒以内,TC 的值都是一样的,哈希验证码也就是一样的。

计算哈希验证码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TOTP = HASH(SecretKey, TC)
  • HASH就是约定的哈希函数,默认是 SHA-1。

TOTP 分类

TOTP 有硬件生成器和软件生成器之分,但都是采用上面的算法。TOTP 硬件生成器实物如下图。

而TOTP 软件生成器目前市面上有Google Authenticator、Microsoft authenticator、Tofu Authenticator等,界面如下图。

📎 参考文章

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
双因素认证(2FA)教程
所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。 越来越多的地方,要求启用双因素认证(Two-factor
ruanyf
2018/04/12
3K0
双因素认证(2FA)教程
业余草双因素认证(2FA)教程
所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤。 密码是最常见的认证方法,但是不安全,容易泄露和冒充。
业余草
2019/01/21
8810
业余草双因素认证(2FA)教程
使用越来越广泛的2FA双因素认证,缘何越发受到推崇?
随着互联网在生活方方面面的应用,日常少不了要登录各个网站或者应用、或者是银行转账等需要验证自己身份的场景。从早期的输入账号密码来登录,到后来普遍开始通过手机验证码进行登录、或者APP扫码进行登录,身份校验的操作方式经历了一轮又一轮的迭代演进。
是Vzn呀
2024/11/22
2491
身份认证之双因素认证 2FA
这里所说的身份认证,指的是狭义上的在计算机及其网络系统中确认操作者身份的过程,从而确定用户是否具有访问或操作某种资源的权限。
出其东门
2021/03/16
3.3K0
RHEL CentOS 8 SSH双因素认证
  双因素认证就是通过 用户已知信息(用户名和密码)+用户预先未知信息 二要素组合到一起实现双因素身份认证。双因素认证是一种采用时间同步技术的系统,采用了基于时间、事件和密钥三变量而产生的一次性密码来代替传统的静态密码。每个动态密码卡都有一个唯一的密钥,该密钥同时存放在服务器端,每次认证时动态密码卡与服务器分别根据同样的密钥,同样的随机参数(时间、事件)和同样的算法计算了认证的动态密码,从而确保密码的一致性,从而实现了用户的身份认证。
Kevin song
2020/06/09
1.8K0
RHEL CentOS 8 SSH双因素认证
什么是双因素验证 2FA,如何用 Python 实现?
你说,加上短信验证码不就安全了,其实短信验证码也是不安全的,容易被拦截和伪造,SIM 卡也可以克隆,已经有案例,先伪造身份证,再申请一模一样的手机号码,把钱转走。
somenzz
2022/10/25
1.2K0
什么是双因素验证 2FA,如何用 Python 实现?
双因子认证是什么
如今,大多数常见应用,如网站和APP,在用户首次使用时通常都需要注册。一般会使用邮箱作为账号,用户再设置一个容易记住的密码。近年来,双因子认证在网站和APP中越来越常见,系统有时还会询问用户是否需要启用这一功能。那么,双因子认证究竟是什么?
写bug的高哈哈
2024/11/08
3470
双因子认证是什么
[信息安全] 4.一次性密码 && 身份认证三要素
在信息安全领域,一般把Cryptography称为密码,而把Password称为口令。日常用户的认知中,以及我们开发人员沟通过程中,绝大多数被称作密码的东西其实都是Password(口令),而不是真正意义上的密码。本文保持这种语义,采用密码来代指Password,而当密码和口令同时出现时,用英文表示以示区分。 0. OTP一次性密码 OTP是One Time Password的简写,即一次性密码。在平时生活中,我们接触一次性密码的场景非常多,比如在登录账号、找回密码,更改密码和转账操作等等这些场景,其
blackheart
2018/01/19
2.2K0
[信息安全] 4.一次性密码 && 身份认证三要素
多因子类身份认证
密码作为我们平时最常使用的用户身份验证方式有其便捷性,但是仔细思考你也不难发现其中存在着较多的安全问题。首先我们的密码是由用户自我定义设置的,期间不排除用户设置弱口令密码或者使用键盘布局的脆弱密码(当然部分考虑安全的系统会制定对应的密码策略对其进行限制),其次即便我们使用了极为复杂的密码,也不能完全规避"社工钓鱼"和"中间人"攻击等威胁,攻击者可以通过脱浏览器端的凭据信息等方式获取用户的密码,再者就是用户都有一个特征就是"惰性",很多用户在多个网站可能会使用同一个登录密码,故此攻击者可以通过找寻被泄露的账户密码获取到真实的账户密码信息并实现登录操作,基于以上多个风险层面,我们接下来对用户的身份认证进行简易的探讨并结合业务、测评等维度给出关联的安全设计
Al1ex
2024/01/02
1.4K0
多因子类身份认证
密码管理和2FA管理软件
现在网络上各种网站服务非常多,每个人至少都有注册过几十上百个网站,账号密码的管理显得尤为重要,很多人为了便于记忆,多种账号采用相同的密码,这种做法非常不安全,因为一旦有一个平台的密码泄露,就很容易被撞库攻击。
六月河
2023/06/26
1.4K0
WinAuth 在Windows上运行的2FA双因素认证器
2FA 的全程是 Two-Factor Authentication,是一种独立于账户密码的验证程序。为了提高账户安全性,2FA 的运用其实相当普遍,像是早些年流行的密保卡和银行的动态口令都属于 2FA 的一种。不过我们今天要提到的,是更加通用化的双因素认证器,例如 Google Authenticator 和 Microsoft Authenticator。
reizhi
2022/09/26
3.7K0
WinAuth 在Windows上运行的2FA双因素认证器
动态令牌_创建安全令牌
HMAC-based One-Time Password 简写,表示基于 HMAC 算法加密的一次性密码。是事件同步,通过某一特定的事件次序及相同的种子值作为输入,通过 HASH 算法运算出一致的密码。
全栈程序员站长
2022/11/17
1.6K0
动态令牌_创建安全令牌
github和npm开启2FA双重身份验证无法登陆
现在很多应用都强制要求开启2FA双重身份验证来登录,比如码农们常用的 github 和 npm,这样就会导致如果我们无法来获取动态码时,比如手机丢了、误操作把手机上的获取动态码app给删了、app挂了...那即使我们有用户名和密码也是没法登录的。
人人都是码农
2025/03/25
2430
github和npm开启2FA双重身份验证无法登陆
谷歌authenticator接入与使用
一、authenticator解决了什么问题二、authenticator的原理三、springboot集成authenticator四、做成可复用starter五、参考
叔牙
2023/08/09
6.5K1
谷歌authenticator接入与使用
登录GitHub要求2FA了,安全且免费密保使用
从 2023 年 3 月开始到 2023 年底,GitHub 将逐渐开始要求在 GitHub.com 上贡献代码的所有用户启用一种或多种形式的双因素身份验证 (2FA)。 如果你在符合条件的组中,当选择该组进行注册时,将收到一封通知电子邮件,该电子邮件标志着 45 天的 2FA 注册期的开始,并且你会看到要求你在 GitHub.com 上注册 2FA 的横幅。 如果未收到通知,则表示你不是需要启用 2FA 的组的成员,但我们强烈建议启用 2FA。
云阳
2023/10/20
2.5K0
登录GitHub要求2FA了,安全且免费密保使用
Linux 利用Google Authenticator实现ssh登录双因素认证
原文地址 https://www.cnblogs.com/tiannan/p/6238832.html
保持热爱奔赴山海
2019/09/17
1.8K0
Linux 利用Google Authenticator实现ssh登录双因素认证
Zabbix 7.0 LTS MFA 多因素身份验证
Zabbix 7.0 版本支持企业级 MFA多因素身份验证(MFA)认证,登录Zabbix 除了用户名和密码之外,还需提供了额外的安全层,增强Zabbix 前端的安全性。使用MFA,用户必须存在于Zabbix中,登录时提供Zabbix凭据同时还必须通过多因素身份验证证明自己的身份。
Kevin song
2024/06/11
5130
Zabbix 7.0 LTS MFA 多因素身份验证
Java整合Google身份验证器:详解及实战应用
咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
bug菌
2024/12/29
4412
Java整合Google身份验证器:详解及实战应用
如何在Ubuntu 14.04上为SSH设置多重身份验证
一个认证因素是单件的使用信息,以证明你有权要执行的操作,如登录到系统中。的认证信道是认证系统提供了一个因子给用户或要求用户回答的方式。密码和安全令牌是身份验证因素的示例; 电脑和手机就是频道的例子。
小铁匠米兰的v
2018/10/19
1.5K0
[RFC6238] TOTP: 基于时间的一次性密码生成算法
在闲暇时间做了一个TOTP相关的开源项目,在项目初步完成之余,我尝试对[RFC6238]文档进行了翻译,供大家参考与查阅,若有不妥之处,还望各位前辈海涵斧正。
翎野君
2024/01/06
6870
[RFC6238] TOTP: 基于时间的一次性密码生成算法
相关推荐
双因素认证(2FA)教程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验