2FA双因素认证 - 原理和应用
主页
- 个人微信公众号:密码应用技术实战
- 个人博客园首页:https://www.cnblogs.com/informatics/
引言
我们在登陆网站、或者通过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选型或应用上有所帮助。
参考资料
- HOTP rfc文档:https://www.ietf.org/rfc/rfc4226.txt
- TOTP rfc文档:https://www.ietf.org/rfc/rfc6238.txt