主页

引言

我们在登陆网站、或者通过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. pandas高效读取大文件的探索之路

    使用 pandas 进行数据分析时,第一步就是读取文件.在平时学习和练习的过程中,用到的数据量不会太大,所以读取文件的步骤往往会被我们忽视. 然而,在实际场景中,面对十万,百万级别的数据量是家常便饭, ...

  2. 卧槽!这 5 个后端程序员学习指南竟然斩获超过 350k 的 star

    前段时间弄应届生学习指南的时候,整理了几个不错的开源文档,分享给小伙伴们!我觉得应该可以对大家有帮助. 本期文章对应的视频地址:https://www.bilibili.com/video/BV1xZ ...

  3. Python 使用XlsxWriter操作Excel

    在数据处理和报告生成的领域中,Excel 文件一直是广泛使用的标准格式.为了让 Python 开发者能够轻松创建和修改 Excel 文件,XlsxWriter 库应运而生.XlsxWriter 是一个 ...

  4. 20.4 OpenSSL 套接字AES加密传输

    在读者了解了加密算法的具体使用流程后,那么我们就可以使用这些加密算法对网络中的数据包进行加密处理,加密算法此处我们先采用AES算法,在网络通信中,只需要在发送数据之前对特定字符串进行加密处理,而在接收 ...

  5. 使用OpenCV实现视频去抖

    使用OpenCV实现视频去抖 整体步骤: 设置输入输出视频 寻找帧之间的移动:使用opencv的特征检测器,检测前一帧的特征,并使用Lucas-Kanade光流算法在下一帧跟踪这些特征,根据两组点,将 ...

  6. 我自创的 Response泛型 返回类,全自动 推断,非常方便使用。

    package com.diandaxia.common.utils; import java.util.Date; /** * by liyuxin 2019.12.16 更新 * 统一返回格式 * ...

  7. ASP.NET Core分布式项目实战(oauth2 + oidc 实现 client部分)--学习笔记

    任务16:oauth2 + oidc 实现 client部分 实现 client 之前启动一下上一节的 server,启动之前需要清除一些代码 注释 Program 的 MigrateDbContex ...

  8. 探索C语言结构体:编程中的利器与艺术

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 1. 常量与变量 1. 什么是结构体 在C语言中本身就自带了一些数据类型,如:char,i ...

  9. Centos7部署django+uwsgi+nginx 转载: https://www.cnblogs.com/wztshine/p/16172154.html

    Centos7部署django+uwsgi+nginx   Django + uwsgi + nginx on Centos7 wsgi 介绍 本小节来自 廖雪峰 wsgi 一文 一个Web应用的本质 ...

  10. UVA12467 Secret Word 题解

    题目传送门 前置知识 前缀函数与 KMP 算法 解法 考虑将 \(S\) 翻转后得到 \(S'\),然后就转化为求 \(S'\) 的一个最长子串使得其是 \(S\) 的前缀.使用 KMP 求解即可. ...