多因子认证 (MFA) 是一种思想,而UsernamePassword,OTP等是具体的认证手段。多因子认证就是将这些认证手段结合。
目录
- 什么是MFA
- MFA的作用
- MFA的实际应用
- 认证
- 认证 (Authentication, AuthN) 因素
- 常见的认证 (Authentication, AuthN) 类型
- 密码认证
- 无密码认证
- 社交认证
- 身份提供者 (Identity provider, IdP)
- 多因素认证
- 生物识别认证
- 企业单点登录 (SSO) 与身份提供者 (IdP)
- 机器对机器认证
- 认证 (Authentication) 的最佳实践是什么?
- 现代应用中的 MFA
- 现代化实现
- 基于时间的一次性密码 (Time-based one-time password, TOTP)
什么是MFA
多因子认证(Multi-Factor Authentication, MFA)是一种安全措施,要求用户在登录时提供多个验证因素来确认其身份,从而增强账户的安全性。它通常结合以下三类因素:
- 知识因素(Something you know):例如密码或PIN码。
- 持有因素(Something you have):例如手机、硬件令牌、智能卡等。
- 固有因素(Something you are):例如指纹、面部识别、虹膜扫描等生物特征。
在进行MFA时,用户必须至少提供两种或更多的验证因素,才能成功访问账户或系统。这样,即使一个因素(如密码)被泄露,攻击者仍需获取其他因素才能成功登录,显著提高了账户的安全性。
例如,在登录过程中,用户可能需要输入密码(知识因素)并通过手机上的验证码(持有因素)来完成认证,或使用指纹(固有因素)进行身份验证。
总而言之,多因子认证(Multi-Factor Authentication, MFA) 是一种方法论,或者说是一种认证策略。它的核心思想是通过要求用户在登录或执行操作时提供多个独立的认证因素,以此增强身份验证的安全性。
MFA的作用
- 提高安全性:即使一个认证因素(比如密码)被泄露,攻击者仍需获得其他认证因素,才能成功登录。
- 防止单点失败:传统的单一认证方式(如只依赖密码)存在被攻击的风险,而MFA通过增加认证因素,降低了某一因素泄露时的风险。
MFA的实际应用
MFA可以应用于各种场景,比如:
- 登录过程:除了账号和密码,可能还要求通过手机短信(OTP)、动态令牌、或生物特征(指纹、人脸识别等)来验证身份。
- 重要操作确认:比如在银行账户进行资金转账时,除了输入密码,还需要进行一次额外的认证(如OTP或设备验证)。
- 云服务访问:在使用 AWS、Azure 等云服务时,API请求通常需要使用 Access Key 和 Secret Key,而管理员操作可能还需要短信验证码、硬件令牌等。
认证
要想了解什么是多因子认证,得先明白什么是认证!
认证 (Authentication, AuthN) 是一种内置于软件中的机制,用于在授予资源访问权限之前根据用户的凭据识别用户。例如,最常见的登录方法涉及电子邮件和密码。系统使用这些凭据来验证用户是否具有正确的身份以访问它。
认证 (Authentication, AuthN) 因素
认证 (Authentication, AuthN) 因素 是在认证过程中用于验证用户身份的证据类别。它们有助于确保只有授权用户才能访问系统或资源。这些因素通常分为三种主要类型,通常称为“三因素认证”。
- 知识因素:你知道的东西(例如,密码,PIN)
- 持有因素:你拥有的东西(例如,智能手机,安全令牌)
- 固有因素:你是什么(例如,指纹,面部识别)
而这三类认证因素分别有如下优缺点:
-
知识因素(Something you know):
- 这是指用户知道的信息,如密码、6位PIN码等。用户通过输入这些内容来证明自己是账户的合法持有者。
- 优点:简单易用,是最常见的认证方式。
- 问题:如果密码被泄露,攻击者可以轻松登录。
-
持有因素(Something you have):
- 这是指用户拥有的物品,如智能手机、硬件令牌、安全卡等。通常通过设备生成的动态验证码(如一次性密码 OTP)来验证身份。
- 优点:相比密码,持有因素不容易被远程盗取。
- 问题:如果设备丢失或被盗,可能会造成安全风险。
-
固有因素(Something you are):
- 这是指用户的生物特征,如指纹、面部识别、虹膜扫描等。这些因素基于个体独特的生物特征,难以伪造或复制。
- 优点:生物特征唯一性强,几乎不可能被盗用。
- 问题:可能涉及隐私问题和硬件的支持限制。
常见的认证 (Authentication, AuthN) 类型
密码认证
密码认证 是一种广泛使用的方法,用于在访问系统或应用程序时验证用户的身份。它要求用户提供电子邮件地址或其他类似标识符(如用户名和电话号码),作为唯一标识符,以及密码(只有用户知道的秘密字符串)以确认他们对电子邮件的所有权。
该过程始于用户在登录表单中输入其电子邮件和密码。然后,系统将这些凭据与其注册用户数据库进行检查。如果凭据匹配,则授予用户访问权限;如果不匹配,则拒绝访问。成功认证后,系统可能会创建一个会话(session)
或发出一个令牌(token)
以保持用户的登录状态。
这种方法简单且广泛支持,使用户易于理解和使用。然而,它也带来了挑战。密码可能会通过网络钓鱼、暴力攻击或数据泄露而被泄露。此外,用户可能会发现记住不同服务的多个密码很不方便。为了解决这些问题,电子邮件和密码认证通常通过安全措施(如双因素认证 (2FA)
)得到增强,增加额外的验证层,或鼓励使用强大、唯一的密码并安全管理。
尽管面临挑战,电子邮件和密码认证仍然是身份验证的基础方法,通常与其他措施结合使用以提高安全性,如
- 短信验证码(OTP):系统向用户注册的手机号码发送一个一次性密码,用户输入该密码来完成认证。
邮件验证码:系统通过电子邮件发送一次性密码,用户在登录时输入此密码。 - 认证应用:使用像 Google Authenticator、Authy 或 Microsoft Authenticator 等应用生成一次性密码,通常每30秒刷新一次。
- 硬件令牌:如 RSA SecurID、YubiKey 等物理设备,生成一次性密码或通过 USB 插口与计算机交互进行身份验证。
- 生物识别:如指纹扫描、面部识别、虹膜扫描等,通过生物特征进行第二步身份验证。
其中,短信验证是最常见的形式。(2FA实际上就是在认证因素中选两个因素提高安全性)
无密码认证
无密码认证 是一种无需传统密码即可验证用户身份的方法。它依赖于替代技术和因素来安全地认证用户。这些方法包括通过电子邮件或短信发送的 一次性密码 (One-time password, OTP) 或认证器应用程序、生物识别认证(如指纹或面部识别)、发送到用户电子邮件的魔法链接、存储在设备上的 passkey,或使用来自 Google 或 Facebook 等提供商的账户进行社交登录。
这种方法通过减少与密码相关的风险(如网络钓鱼、暴力攻击和泄露)来提高安全性。它还通过消除记住和管理密码的需要来改善用户体验,同时通过减少密码重置请求来降低维护成本。
社交认证
社交认证 是一种通过允许用户使用其现有的社交媒体或身份提供者平台(如 Google、Facebook、Twitter 或 LinkedIn)的凭据登录应用程序或网站来验证用户身份的方法。用户无需为每个应用程序创建新的用户名和密码,而是可以使用他们已经信任的账户进行认证。
当用户选择社交登录选项时,他们会被重定向到所选平台以确认其凭据。一旦认证成功,平台会向应用程序提供令牌或用户信息(如姓名、电子邮件地址或个人资料图片)以验证其身份。这个过程是安全的,并且通常简化了用户的登录体验。
社交认证减少了用户的摩擦,通过利用 身份提供者 (Identity provider, IdP) 的基础设施提高了安全性,并允许应用程序快速收集经过验证的用户数据。它在优先考虑访问便利性和与社交平台集成的应用程序中特别受欢迎。
身份提供者 (Identity provider, IdP)
身份提供者 (IdP) 是管理身份的中央服务。它负责认证 (Authentication) 用户、签发身份令牌,并向 服务提供者 (例如应用程序、服务、API)提供用户信息。
由于身份管理的性质以及互操作性的需求,没有标准来构建身份提供者将是不切实际的且效率低下。以下是一些典型场景:
- 两个身份提供者需要相互通信以交换用户信息(例如,社交登录)。
- 一个应用程序需要使用多个身份提供者来认证 (Authentication) 用户(例如,联合身份)。
- 一个身份提供者需要支持多种类型的客户端(例如,Web、移动、物联网)。
为了应对这些场景,业界为身份提供者开发了几种流行的标准:
- OAuth 2.0 :一种广泛使用的授权 (Authorization) 框架,使应用程序能够代表用户或服务获取访问权限。
- OpenID Connect (OIDC) :一个基于 OAuth 2.0 之上的身份层,提供认证 (Authentication) 和用户信息。
- 安全断言标记语言 (Security Assertion Markup Language, SAML) :一种在安全域之间交换认证 (Authentication) 和授权 (Authorization) 数据的标准。
对于新应用程序,OpenID Connect (OIDC) 是构建身份提供者或集成现有身份提供者的推荐标准。
多因素认证
多因子认证 (Multi-factor authentication, MFA) 是一种安全过程,要求用户使用两个或多个不同的认证因素来验证其身份。这些因素通常分为三类,就像我们上面提到的认证因素一样:你知道的东西,你拥有的东西,以及你是什么。
通过结合多个因素,MFA 显著增强了安全性。即使一个因素(如密码)被泄露,额外的验证层也使未经授权的用户更难获得访问权限。
MFA 广泛用于需要更高安全级别的系统中,如在线银行、企业网络、财务敏感产品和云服务。它不是一种认证方法,而更准确地说是一种认证的安全措施。
举个例子比如我的APP提供如下认证流水线:
- 首先要求用户输入账号密码:Username-Password
- 认证通过之后,我再给用户手机发送一条短信
- 再次认证通过后我要求用户输入Authenticator的动态验证码
- …
生物识别认证
生物识别认证 是一种基于独特的物理或行为特征验证用户身份的安全过程。这些特征,如指纹、面部特征或语音模式,是高度个体化且难以复制的,使这种方法安全可靠。
该过程始于注册,用户的生物识别数据被捕获并安全存储为参考。在认证过程中,系统捕获用户的实时生物识别数据并将其与存储的参考进行比较。如果数据匹配,则授予访问权限;否则,拒绝访问。
这种方法很方便,因为用户不需要记住密码或携带物理令牌。它广泛用于智能手机、银行应用程序、安全设施和医疗系统等应用中,以提供快速、可靠和用户友好的访问。
举个例子:在你注册APP完成后,APP会弹出“是否开启指纹登陆”
的对话框,然后尝试去采集你的指纹。
企业单点登录 (SSO) 与身份提供者 (IdP)
- 单点登录 (Single sign-on, SSO) 是一个广义术语,指的是用户可以一次登录并访问多个应用程序或资源,而无需再次登录。
- 企业 SSO 是一种专为组织内员工设计的特定类型的 SSO。
我们来看一个例子:
一个名为 Amazed 的在线购物网站有两个 Web 应用程序:一个供客户使用,一个供店主使用。客户登录到购物应用程序以购买产品,而店主登录到店主应用程序以管理他们的商店。两个应用程序都使用相同的身份提供商进行认证 (Authentication)。因此,用户只需登录一次即可访问这两个应用程序,从而提供单点登录体验。
其工作原理如下:
- 用户通过 IdP(例如,Google 或 Azure AD)登录。
- IdP 认证用户并发出令牌或断言。
- 令牌与其他连接的应用程序或服务共享,以便在无需额外登录的情况下授予访问权限。
这种设置简化了用户访问,同时集中管理身份以提高安全性。
机器对机器认证
机器对机器 (Machine-to-machine, M2M) 通信指的是设备之间无需人为干预的自动化数据交换。在认证 (Authentication) 和授权 (Authorization) 的环境中,M2M 通信通常涉及需要访问资源的客户端应用程序,其中客户端应用程序是机器(服务)或代表用户行事的机器。
比如某些开放平台提供的API keys:每个服务可以拥有一个或多个 API keys,用于认证 (Authentication)(有时也用于授权 (Authorization))。你可能会看到某些服务要求你在请求头中提供 API key,例如 X-API-Key: your-api-key。
优点:
- 实施和使用简单。
- 通过安全的随机生成和足够长,API keys 很难被猜测。
- 验证是动态的,这意味着你可以在任何时间撤销 API key。
缺点:
- 需要网络通信来验证 API key。
- 它不是自包含的,这意味着需要一个服务来进行 introspection。
- 其他服务与拥有 API key 的服务具有相同的访问级别(可以通过使用 API 网关部分缓解)。
- 在服务之间管理大量 API keys 很难。
在 M2M 认证中,与传统用户认证使用用户名和密码不同,机器依赖于安全凭据,如 API 密钥、证书或令牌(例如, OAuth 2.0 )。这些凭据用于验证机器或服务是否被授权访问另一台机器或资源。
例如,当移动应用程序与云服务器通信以检索用户数据时,服务器使用 API 密钥或令牌对应用程序进行认证,以确认它是合法客户端。同样,在物联网中,智能恒温器或可穿戴设备等设备使用证书或安全令牌与其控制系统或数据服务器进行认证。
M2M 认证对于确保自动化系统中的数据安全和信任至关重要,尤其是在交换敏感信息的环境中。
认证 (Authentication) 的最佳实践是什么?
实施认证功能需要关注关键原则。强烈建议使用可信协议,如 OAuth 2.0 或 OpenID Connect,并加密敏感数据。此外,提供社交登录、无密码方法(如 passkey)以及支持各种认证方法(如用户名/密码、生物识别或 SSO)的选项,有助于系统满足不同用户的需求。
建议使用经过验证的框架和协议,而不是构建自有的认证系统,因为它们已经过安全专家的测试和审查。有多种认证框架和协议定义了如何执行认证。两个常见的例子是:
- OpenID Connect (OIDC) :构建在 OAuth 2.0 之上的身份层,增加了认证功能。它相对现代,广泛用于新应用程序。
- 安全断言标记语言 (Security Assertion Markup Language, SAML) :用于在各方之间交换认证和授权数据的协议。它通常用于企业环境。
框架的选择取决于你的用例和需求。对于新应用程序,推荐使用 OIDC,因为它具有现代设计并支持 JSON Web Token (JWT) 。
然而,直接使用这些协议仍然可能复杂且耗时。这两个协议都有陡峭的学习曲线,并需要仔细实施以确保安全。相反,使用支持或基于这些协议的 身份提供者 (Identity provider, IdP) 可以大大简化认证过程。
现代应用中的 MFA
了解完什么是认证之后,我们再次回归MFA,这次我们探索现代化的MFA方法!
以下是 MFA 的示例:
在上面的示例中,有两个因子:
- 用户名和密码
- 来自移动应用的 基于时间的一次性密码 (Time-based one-time password, TOTP)
常见的 MFA 设置涉及组合来自不同类别的两个因子,例如密码(知识)和认证应用的 基于时间的一次性密码 (Time-based one-time password, TOTP) (拥有)。
MFA 的重要性在数据中是显而易见的:MFA 将整个用户群体内的风险降低了 99.22%
,在泄露凭证的情况下降低了 98.56%
。借助 MFA,可以更有信心地执行更关键的操作,如访问敏感数据和执行金融交易。与仅仅使用密码或单一因子认证相比,这是一种简单而有效的方法,可以提供更高的安全级别。
没有完美的安全,只有不同等级的不安全。— 萨尔曼·拉什迪
现代化实现
正如其名,MFA 可以涉及两个以上的因子。随着因子数量的增加,安全级别和认证过程的复杂性也会增加,这可能会降低用户友好性。尽管 基于时间的一次性密码 (Time-based one-time password, TOTP) 在近年来是一个流行的选择,但像 密钥 (Passkey) 这样的新技术正在出现,以提供更安全且更用户友好的 MFA 体验。
例如,现代应用可能会使用 WebAuthn API 来通过 passkey 实现 MFA,这些 passkey 是通过公钥加密技术保护的防钓鱼凭证。苹果等公司已将 passkey 与生物认证(Touch ID、Face ID)集成,在 MFA 过程中本地添加固有特征因子,提高安全性和用户便利性。
为了更好地理解,我们来做一个快速比较。假设我们有一个用户,他有:
- 在手机上安装的应用生成 TOTP 代码。
- 与设备的生物认证集成的 passkey。
当他们在笔记本电脑上启用 MFA 登录网站时,这两个过程如下所示:
显然,WebAuthn 过程需要更少的步骤并且耗时更短。更重要的是,苹果等公司支持在设备(如 iPhone、iPad、Mac)之间同步 passkey,以使 MFA 过程更顺畅,同时保持高水平的安全性。
基于时间的一次性密码 (Time-based one-time password, TOTP)
基于时间的一次性密码 (TOTP) 是一种通过使用当前时间作为关键因素的算法生成的临时唯一代码。类似于通用的 一次性密码 (One-time password, OTP) ,TOTP 只能使用一次,但它有固定的生命周期,通常在 30 到 60 秒之间。到期后,会自动生成一个新代码。
由于 TOTP 依赖于客户端(用户设备)和服务器之间的时间同步,它们提供了高度的安全性,并且难以预测或重用。
TOTP 的生成包括以下步骤:
- 共享密钥:在初始设置期间,会生成一个共享密钥,并在客户端和服务器上安全存储。此密钥通常编码为二维码,用户可使用认证 (Authentication) 应用扫描该二维码。
- 时间间隔:将当前时间划分为固定间隔,通常为 30 秒。
- 算法应用:将共享密钥和当前时间戳输入基于散列的算法(通常为 HMAC-SHA1)以生成唯一的数字代码。
- 同步:客户端和服务器使用相同的共享密钥和当前时间戳独立生成代码。只有在两者同步时,代码才匹配。
- 验证:当用户登录或执行关键事务时,他们输入在其认证 (Authentication) 应用上显示的 TOTP。然后服务器将其与内部生成的 TOTP 进行比较以进行验证。
在大多数情况下,推荐使用普通的 OTP,但在无法“触发”新密码的情况下,建议使用 TOTP。
- TOTP 示例:认证器应用
- OTP 示例:电子邮件, 短信
OTP 和 TOTP 有什么区别?主要区别在于 TOTP 是基于时间的,因此适用于设备未连接到服务器的情况。服务器可以轻松地向电子邮件地址或手机号发送新的密码,但这需要电子邮件或手机在线。然而,认证器应用可以保持离线并使用“时间”来验证密码。
如何理解“设备未连接到服务器
”呢?
首先需要明白OTP和ToTP的原理:
-
OTP(一次性密码):
- 工作原理:OTP通常是服务器端生成的密码,服务器会将其通过短信、电子邮件等方式发送给用户。然后用户输入收到的OTP来进行身份验证。
- 依赖网络:这个过程依赖于设备和服务器之间的通信。用户的设备必须能够接收到服务器发送的OTP(如短信或邮件),如果设备离线或网络不可用(
我把电话卡拔了
),用户将无法获得OTP,因此无法进行身份验证。
-
TOTP(基于时间的一次性密码):
- 工作原理:TOTP生成的密码是基于时间和一个共享的密钥。用户的设备和服务器都有一个相同的密钥,且都同步使用相同的时间戳来生成密码。TOTP通常每30秒或60秒生成一个新的密码。
- 不依赖网络:TOTP的核心优势是它的生成完全依赖于本地时间和共享的密钥。也就是说,即使用户的设备没有网络连接,它依然能够在本地生成有效的动态密码,只要设备的时间和服务器保持同步。
当我们说 TOTP “适用于设备未连接到服务器的情况”时,意思是说,用户的设备可以脱离服务器的连接(即没有网络),但仍然能够生成有效的密码,并且完成身份验证。具体是因为:
-
密码生成的本地化:
- 在TOTP中,密码是由本地认证器应用生成的,并不是由服务器动态生成并发送的。认证器应用(例如 Google Authenticator、Authy 等)依赖于设备上的时间和共享的密钥来生成一次性密码。
- 例如:假设你已经安装了Google Authenticator,并且已经将其与服务器进行过一次同步。当你打开Google Authenticator时,它会基于当前的时间和一个事先共享的密钥生成一个一次性密码,这个密码与服务器上的密钥匹配。
-
设备与服务器时间同步:
- TOTP的密码生成依赖于当前时间(例如,每30秒更新一次)。这意味着用户的设备和服务器在开始时需要同步一次时间,即确保它们对时间的理解是相同的(如设备时间和服务器时间一致)。
- 一旦同步完成,即使设备离线,也能生成与服务器匹配的密码。只要设备的时间没有偏差,认证器应用就能生成有效的密码。
-
无需持续网络连接:
- 当用户输入TOTP时,不需要从服务器获取新密码。用户设备上的认证器应用生成的密码会立即与服务器验证,服务器只需检查密码和时间戳是否匹配,验证过程不需要设备和服务器的实时通信。
- 例子:即使你处于飞行模式或者没有网络的情况下,只要你的设备时间和服务器同步,你依然可以使用Google Authenticator生成密码来进行身份验证。用户输入的TOTP会与服务器计算出的密码进行比对,从而完成验证。
举个例子:TOTP在没有网络连接时如何工作
-
设备同步:你安装了一个认证器应用(比如Google Authenticator),并在第一次使用时将其与服务器同步(
一般会让你扫一个二维码
)。这时,认证器应用和服务器都有相同的密钥,并且在同一时刻开始使用同步时间戳来生成密码。 -
生成密码:当你离开办公室,手机处于飞行模式,无法接收短信或邮件时,你仍然可以使用Google Authenticator生成一个新的密码。这个密码是基于本地的当前时间和同步的密钥生成的。
-
验证密码:当你想登录一个网站时,服务器会根据自己的时间和同步的密钥计算出一个当前有效的TOTP密码。如果你输入的密码与服务器计算出的密码匹配,即使你处于离线状态,身份验证也会成功。
具体TOTP协议标准可以参考rfc6238:https://www.rfc-editor.org/rfc/rfc6238