2FA双因素认证 - 原理和应用

主页

引言

我们在登陆网站、或者通过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选型或应用上有所帮助。

参考资料

posted @ 2023-08-15 17:51  warm3snow  阅读(1752)  评论(0编辑  收藏  举报