主页

引言

我们在登陆网站、或者通过VPN访问公司内网时,除了输入用户口令外,还经常需要输入一次验证码。 这种除了用户口令,还需要其他身份认证信息的方式,我们叫做多因素认证, 如果其他身份认证信息仅有一个,我们叫做双因素认证。由于密评对信息系统具有较高的要求,因此在密评技术要求-应用和数据安全中将双因素认证作为重要评测标准之一,也是需要“密改”的关键点。

本文主要聚焦于常见双因素认证的原理及流程,以便于读者能够了解双因素认证内部机制并应用,提高应用和数据的安全性。

本文内容组织:

  • 简介
  • 常见2FA及工作原理
  • 常见2FA对比
  • 总结
  • 参考资料

简介

双因素认证,英文名称Two Factor Authentication, 简称2FA。从名称上我们可以了解到,2FA包含两个认证因素:

  • 第一个因素是您账户的常规密码
  • 第二个因素是从移动设备或计算机上的应用程序中获取的验证码。如:手机验证码、邮箱验证码、一次密码TOTP等等

使用2FA的主要目的是增强账户的安全性,提供额外的保护层,以防止未经授权的访问和潜在的安全威胁。

以下是为什么要使用2FA的一些重要原因:

  • 降低密码盗窃风险:即使恶意人士获得了用户的密码,但由于需要第二个因素,他们仍然无法轻易登录账户,从而降低了密码盗窃的风险
  • 防止弱密码攻击:很多用户倾向于使用弱密码,容易受到字典攻击和暴力破解。2FA可以减轻这些攻击的影响,因为攻击者仍需要第二个因素。
  • 减少账户被盗风险:2FA大大减少了账户被盗的风险,因为即使攻击者获得了密码,他们仍然需要额外的因素。
  • 抵御社会工程学攻击:社会工程学攻击通常涉及欺骗用户提供其凭证。2FA使攻击者更难以成功进行此类攻击,因为攻击者需要更多的信息。
  • 保护敏感信息:许多账户包含敏感信息,如财务数据、个人隐私等。2FA提供了额外的保护,确保只有授权用户可以访问这些信息。
  • 符合合规要求:在某些情况下,如金融机构和医疗领域,使用2FA是合规性要求的一部分。
  • 提升安全文化:使用2FA可以提高用户对账户安全性的意识,鼓励更好的安全实践。

尽管2FA并不能完全消除所有安全威胁,但它是一种非常有效的方法,可以显著提高账户的安全性。通过多因素验证,即使密码泄露,攻击者也难以轻松进入您的账户。

常见2FA及其工作原理

为了方便介绍,我们提到双因素认证或2FA时,如果不单独说明,主要指第二个因素。2FA一般有两个阶段:

  • 2FA生成阶段
  • 2FA验证阶段

按照2FA生成阶段生成验证码的方式,我们可以将常见的双因素认证分为三类:

  • OTP模式:这种模式下,一般需要用户首先持有特殊设备或安装特殊软禁,用户登陆时从特殊设备或软件获取一次验证码;

    当服务端收到验证码后,用相同的方式生成验证码并比对。此类模式的2FA代表有:HOTP、TOTP、动态令牌等
  • 服务端模式:在此类模式中,验证码由服务端生成,然后第三方途径发送给用户,当服务端收到验证码后,与之前生成的进行比对。 此类模式的2FA代表有:手机验证码、邮箱验证码、图片验证码等
  • 签名模式:这类模式一般由服务端生成挑战码,并由客户端对该挑战码进行签名,再由服务端验签完成。如:UKey等

用户在登录认证时,会输入用户名和密码, 并携带上述获取的验证码 发送给服务端,服务端进行2FA验证流程

  • 验证用户/密码是否正确
  • 验证收到的"验证码“是否匹配

以上两个因素都验证通过后,用户登陆成功

2FA服务端模式

2FA服务端模式比较有代表性的是手机验证码(邮箱验证码和图片验证码流程类似), 此类2FA的工作原理/流程如下:

  • 2FA生成阶段

01: 用户打开登陆页,比如某个网站或APP

02-03: 点击获取验证码,在支持2FA的网站登陆页,一般都存在着获取验证码的链接或按钮,等点击链接后,客户端会向服务端发送验证码请求

04-05:服务端生成验证码(随机数,一般为4-6位的数字或字母),并缓存到本地,用于之后的比对。

06-07: 服务端会将验证码通过手机(或邮箱、http响应)等方式发送给用户。

用户在客户端登陆页面,输入自己的用户名/密码以及收到的随机验证码, 并点击登陆。

  • 2FA验证阶段

10: 首先验证用户名&密码是否正确。若不正确,登陆失败;若正确,则继续

11: 验证用户输入的验证码是否与服务端发送的匹配。若不匹配,登陆失败;若匹配,则返回登陆成功

OTP模式

OTP全称One Time Password,因此一般叫做一次密码,与常规密码不同的是,该密码一般只能使用一次,下次使用时作废。

OTP模式与服务端模式在验证码生成和验证方式上有很大的不同,主要表现在(OTP模式下):

  • 客户端和服务端会分别计算验证码
  • 客户端和服务端计算验证码时,基于事先共享的OTP密钥
  • 由于客户端和服务端分别计算验证码,因此可以容忍网络延迟&临时网络不通

OTP模式的主要流程如下:

01: 用户打开登陆页,登陆页要求用户输入验证码(一次密码)

02-04: 用户打开手机App(如Google Authenticator),该App会基于本地计数C本地时间共享密钥K,并使用密码技术HMAC算法计算得到验证码,并显示给用户

05-06: 用户输入用户名/密码/验证码进行登陆认证

07: 服务端首先验证用户的用户名/密码是否正确。

08-10: 服务端使用与客户端相同的方式计算验证码,并与从客户端收到的进行比对。若不匹配,则失败;若匹配,则返回登陆成功

OTP主要技术实现有:

  • HOTP:hash-based one time password,基于计数器的一次密码,该技术需要客户端与服务端共享加密密码K, 以及计数器C, 然后通过如下算法计算一次密码(验证码):
  # K:加密密码,作为HMAC密码算法输入,由于只有客户端和服务端共享,因此在不知道K的情况下,无法生成,保证安全性。
# C:计数器,每次使用后C需要+1,需要客户端和服务端同步,保持一致
# h:表示使用密码技术得到的一次密码(但是由于h长度较大,不适合作为验证码,因此需要进一步截取
h = HMAC(K, C) # otp:一次密码,通过对h进行截取处理(这里的digit代表需要截取的位数,通常情况下为6)
otp = Trunc(h, digit)
  • TOTP:time-based one time password,基于时间的一次密码,该技术需要客户端和服务端共享加密密钥K更新周期Period并进行时钟同步,然后通过如下算法计算一次密码(验证码):
  #  T表示当前时间,T0表示初始时间(一般为0,可省略)
# Period表示更新周期(一般为30秒)
# C表示基于时间生成的计数
C = (T - T0) / Period # K:加密密码,作为HMAC密码算法输入,由于只有客户端和服务端共享,因此在不知道K的情况下,无法生成,保证安全性。
# C:计数器,客户端和服务端基于本地时间分别计算
# h:表示使用密码技术得到的一次密码(但是由于h长度较大,不适合作为验证码,因此需要进一步截取
h = HMAC(K, C) # otp:一次密码,通过对h进行截取处理(这里的digit代表需要截取的位数,通常情况下为6)
otp = Trunc(h, digit)

TOTP更直观一点的流程如下:

  • 服务端生成二维码(二维码中包含需要与客户端共享的信息:OTP密钥K,以及更新周期)
  • 用户安装客户端(如手机APP)
  • 客户端和服务端基于各自的本地时间计算验证码
  • 用户登录某网站时,从手机APP获取客户端验证码,发送给服务端
  • 服务端进行验证

UKey模式

UKey模式比较特殊,也是最安全的2FA认证方式,但一般需要用户持有硬件设备,在使用时需要将UKey连接客户端(如PC机等)。UKey中主要存储了两个信息:

  • 用户ID和数字证书/私钥
  • UKey的TokenID

基于UKey的2FA验证码生成流程如下:

  • 01: 用户将UKey连接客户端(一般需要将UKey查到PC机的USB插口,并在机器上安装关联驱动程序
  • 02-04: 用户打开登陆页面,并输入用户名/密码进行登录认证
  • 05-07: 服务端首先验证用户名&密码是否正确,成功后会在本地生成随机挑战码(验证码)并缓存,然后发送给客户端(登陆页)。
  • 08-10: 客户端会使用UKey驱动程序,并调用签名模块,基于UKey中用户的数字证书私钥,对该挑战码进行签名。

基于UKey的2FA验证流程如下:

  • 11: 客户端发送用户名、挑战码以及挑战码的签名值(注:这里根据实现,也可以不再发送挑战码,因为该挑战码由服务端生成并缓存)
  • 12: 服务端使用注册的UKey用户数字证书,对挑战码进行签名验证,通过则登陆成功。

常见2FA对比

2FA模式 主要代表 安全性 易用性
服务端模式 手机验证码,邮箱验证码 低 (未使用加密技术,容易被窃取) 高(无需额外软件或设备)
OTP Googule Authenticator,Microsoft Authenticator 中(使用了加密技术,客户端和服务端分开生成,可以不依赖于网络环境) 中 (需要安装手机App)
UKey U盾 高 (通过挑战码&数字签名方式进行认证,安全性很高) 低(需要额外的硬件设备,携带不方便)

从上述对比上看:

  • UKey模式虽然提供了最高的安全性,但由于易用性比较低,只有在政务、金融、军工等关键领域才会用到。(该方式也是密评推荐的方式)
  • OTP模式基于手机App,需要进行安装。安装后易用性与手机验证码基本相同,同时该方式可用性比较高。
  • 服务端模式(手机/邮箱验证码)未使用密码技术,安全性较低,但是由于该方式不依赖于额外软硬件设备,易用性也最高。

值得注意的是,不管是手机验证码、TOTP或U盾模式,都不能保证通信的安全,因此需要配合安全通信协议TLS才能保证2FA流程的安全性。TLS原理和应用可以参考之前的系列文章,传送门:

[TLS原理与实践]: https://www.cnblogs.com/informatics/p/17433116.html

总结

本文介绍了当前信息系统常用的双因素认证2FA进行了归类,并详细分析了不同类2FA的工作流程和主要原理,最后对常见2FA进行了对比分析。 希望本文能够对读者在遇到2FA选型或应用上有所帮助。

参考资料

2FA双因素认证 - 原理和应用的更多相关文章

  1. 用Abp实现双因素认证(Two-Factor Authentication, 2FA)登录(一):认证模块

    @ 目录 原理 用户验证码校验模块 双因素认证模块 改写登录 在之前的博文 用Abp实现短信验证码免密登录(一):短信校验模块 一文中,我们实现了用户验证码校验模块,今天来拓展这个模块,使Abp用户系 ...

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

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤.密码是最常见的认证方法,但是不安全,容易泄露和冒充.越来越多的地方,要求启用双因素认证(Two-factor au ...

  3. 双因素认证(2FA)教程

    所谓认证(authentication)就是确认用户的身份,是网站登录必不可少的步骤. 密码是最常见的认证方法,但是不安全,容易泄露和冒充. 越来越多的地方,要求启用 双因素认证(Two-factor ...

  4. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  5. Linux 之 利用Google Authenticator实现用户双因素认证

    一.介绍:什么是双因素认证 双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产 ...

  6. 轻松搭建CAS 5.x系列(8)-在CAS Server增加双因素认证(DUO版)

    概述说明 为了让系统更加安全,很多登录会加入双因素认证.何为双因素,如果把登陆作为开一扇门的话,那就是在原来的锁上再加一把锁,第二锁用新的钥匙,这样安全系数就更加高了. CAS是通过账号名和密码来认证 ...

  7. java 双因素认证(2FA)TOTP demo

    TOTP 的全称是"基于时间的一次性密码"(Time-based One-time Password).它是公认的可靠解决方案,已经写入国际标准 RFC6238. 很早就知道有这个 ...

  8. 【Linux】使用Google Authenticator 实现ssh登录双因素认证

    一般来说,使用ssh远程登录服务器,只需要输入账号和密码,显然这种方式不是很安全.为了安全着想,可以使用GoogleAuthenticator(谷歌身份验证器),以便在账号和密码之间再增加一个验证码, ...

  9. ASP.NET Core & 双因素验证2FA 实战经验分享

    必读 本文源码核心逻辑使用AspNetCore.Totp,为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明. 为了防止不提供原网址的转载,特在这里加上原文链接: https:// ...

  10. 操作系统(AIX)双因素身份认证解决方案-中科恒伦CKEY DAS

      一.场景分析 操作系统是管理计算机硬件与软件资源的计算机程序,用于工作中的进程管理.存储管理.设备管理.文件管理.作业管理等,十分重要,安全等级极高! 二.问题分析 1.密码设置简单,非常容易被撞 ...

随机推荐

  1. 手撕Vuex-实现共享数据

    经过上一篇章介绍,完成了添加全局 $store,接下来就是实现共享数据的功能. 在 Vuex 中,共享数据是通过 state 来实现的,所以我们需要在 Nuex.js 文件中实现 state 的功能. ...

  2. 语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse

    基于无监督预训练语义索引召回:SimCSE.Diffcse 语义索引(可通俗理解为向量索引)技术是搜索引擎.推荐系统.广告系统在召回阶段的核心技术之一.语义索引模型的目标是:给定输入文本,模型可以从海 ...

  3. paddle之visualDL工具使用,可视化利器。

    相关链接: [一]AI Studio 项目详解[(一)VisualDL工具.环境使用说明.脚本任务.图形化任务.在线部署及预测]PARL_汀.的博客-CSDN博客 isualDL 是一个面向深度学习任 ...

  4. Hadoop3 No FileSystem for scheme "hdfs"

    Hadoop3 No FileSystem for scheme "hdfs" 异常信息: org.apache.hadoop.fs.UnsupportedFileSystemEx ...

  5. 在K8S中,Pod亲和性概念是什么?

    在Kubernetes(简称K8S)中,Pod亲和性和反亲和性(Affinity and Anti-Affinity)是集群调度策略的重要组成部分,它们用于控制Pod如何与节点或其他Pod相对应地放置 ...

  6. ECMAScript 2023 新特性预览

    ECMAScript 2023 的最终版本预计将于今年 6 月底发布.会议基本已经确定 了 ECMAScript 2023 的新功能列表,预计不会再有任何重大的编辑更改. 着该提案已被 ECMAScr ...

  7. JQ模糊查询插件

    //构造函数写法 ;(function($,window,document,undefined){//注意这里的分号必须加 //插件的全部代码 var FazzSearch = function (e ...

  8. PCIe Gen 4 SSD主控大盘点:7000MB/s高速时代,到底谁能称王?

    [硬件编年史]自2006年世界上第一款搭载固态硬盘的电脑诞生之后,消费级SSD经过十几年的发展,从一开始的SATA 6Gbps SSD,到坚挺了十年的PCIe Gen 3 SSD,再到PCIe Gen ...

  9. .NET Core开发实战(第1课:课程介绍)--学习笔记

    01 | 课程介绍 讲师介绍 肖伟宇,校宝在线架构师.SkyWalking .NET探针贡献者.NetCorePal组件库创建者 为什么要学习 .NET Core 微软大力支持推动 .Net 技术生态 ...

  10. FUN GAME 一款普通的C++游戏

    凑合看吧,不是完整版. #include<bits/stdc++.h> #include<windows.h> #include<conio.h> using na ...