指南

什么是双因素认证?通俗指南

双因素认证(2FA)是一种登录方式,要求提供两种不同类型的证明,以确认你就是你所声称的人:通常是你知道的东西(例如密码)加上你拥有的东西(例如手机或安全密钥)。即使犯罪分子窃取或猜到了你的密码,没有第二个因素,他们也无法登录。对于那些重要的账户,这是最简单的保护方式之一。

用AI搭建时,它为什么重要

当你向AI搭建工具要求添加“登录”功能时,通常得到的是邮箱加密码。这是一个不错的起点,但密码会被重复使用、遭遇钓鱼或泄露。如果你的应用保存了有价值的内容,例如客户记录、发票、管理功能或支付设置,一个被盗的密码就可能暴露全部信息。

2FA还涉及一些你一开始可能想不到的决策:

  • 谁必须使用。 对所有人可选,对管理员强制,还是对所有人都强制?
  • 支持哪些方式。 验证器应用的验证码、短信、通行密钥、安全密钥。
  • 用户被锁定时怎么办。 丢失手机是任何启用2FA的应用中最常见的支持请求。
  • 在哪里执行。 验证必须在服务器端完成。如果2FA页面只是在浏览器中隐藏了页面内容,就可以被绕过。

你不必自己实现加密技术,成熟的库和认证服务商会处理这些。但你需要知道该提出什么要求。

一个日常类比

可以把它想象成银行的保险箱。要打开保险箱,你需要出示身份证件(银行核对的是你是谁或你知道的信息),并且需要实体钥匙(你拥有的东西)。窃贼即使仿冒了你的签名,也没有钥匙;即使扒走了钥匙,也过不了身份核对这一关。

2FA的原理相同。密码相当于签名,手机或安全密钥相当于实体钥匙。任何一个单独都不够。

三类因素

安全标准(例如美国国家标准与技术研究院NIST的数字身份指南)将因素分为三类:

因素示例
你知道的东西密码、PIN码
你拥有的东西装有验证器应用的手机、安全密钥、保存通行密钥的设备
你的生物特征指纹、面部——通常用于解锁设备,再由设备完成真正的验证

关键在于不同。密码加安全问题是两样你知道的东西,因此它并不是真正的双因素认证。如果一次泄露就能同时暴露两者,那它只算一个因素。

常见2FA方式对比

方式工作原理强度说明
短信验证码验证码通过短信发送到你的手机号最弱容易遭受SIM卡交换和钓鱼攻击,但仍远好于没有2FA
邮件验证码验证码通过邮件发送给你弱安全性只取决于邮箱账户本身
验证器应用(TOTP)谷歌验证器等应用每30秒左右生成一个新的6位数字码良好可离线工作;但如果钓鱼网站索要该验证码,仍可能被骗
推送确认应用询问“是你本人吗?”,你点击批准良好注意“确认疲劳”,即用户为了停止重复提示而不假思索地点击同意
通行密钥或安全密钥设备上的加密密钥证明你访问的是真正的网站最强能抵抗钓鱼,因为它不会对仿冒域名作出响应

NIST的指南认为需要手动输入验证码的方式(短信、邮件、验证器应用)并不具备抗钓鱼能力,并将通过电话网络发送验证码的方式标记为“受限”。基于WebAuthn/FIDO2标准的通行密钥和硬件安全密钥,则被视为具备抗钓鱼能力。

实际的结论是:对大多数应用而言,验证器应用是强大且易于使用的默认选择;如果你的用户能够接受,也值得提供通行密钥。

实例:为客户门户添加2FA

假设你搭建了一个门户,一家小型会计事务所通过它与客户共享税务文件。下面是一个合理的2FA设置流程,一步一步来看。

开启(注册)。 客户Priya打开设置,点击“开启双因素认证”。应用生成一个密钥,并以二维码的形式显示。她用验证器应用扫描,应用便开始显示6位数字码。她将当前的验证码输入门户,以证明设置成功。应用随后显示十个恢复码,并提醒她妥善保存。

之后的登录。

  1. Priya输入邮箱和密码。服务器进行核对。
  2. 服务器不会直接让她登录,而是将会话标记为“密码已通过,等待第二因素”,并显示验证码输入界面。
  3. 她输入验证器应用中的验证码。服务器将其与她保存的密钥比对,并允许少量的时钟偏差。
  4. 只有到这一步,服务器才会创建完整的会话,让她查看文件。

攻击者会看到什么。 如果Priya的密码是从其他网站泄露的,攻击者会卡在第3步。每一次验证码错误尝试都会被计数,多次错误后,账户将被暂时锁定,并且Priya会收到一封邮件。

丢失手机。 Priya使用一个恢复码登录,关闭并重新开启2FA(使用新手机),并获得新的恢复码。已用过的恢复码永远不能再次使用。

员工账户。 事务所的会计师可以查看所有客户的文件,因此门户要求员工账户必须启用2FA;未完成注册前,他们无法进入仪表盘。

常用术语解释

术语含义
2FA / MFA双因素 / 多因素认证:使用一种以上类型的证明进行登录。
因素(Factor)一种证明类型:你知道的、拥有的或你本身的特征。
TOTP基于时间的一次性密码,即验证器应用中不断变化的验证码。
共享密钥(Shared secret)通过二维码设置、由应用和手机共同使用以生成相同验证码的隐藏值。
恢复(备用)码(Recovery / backup codes)在失去第二因素时用于登录的一次性代码。
通行密钥(Passkey)保存在设备上的登录凭证,使用公钥加密代替密码。
安全密钥(Security key)小型实体设备(USB或NFC),与通行密钥的作用相同。
SIM卡交换(SIM swapping)欺骗运营商把某人的号码转移到新SIM卡上,使短信被发送给攻击者。
钓鱼(Phishing)诱骗人们交出密码或验证码的仿冒网站或消息。
二次验证(Step-up authentication)在执行敏感操作(如更改收款信息)之前再次要求第二因素。

常见错误与误解

  • “2FA让账户无法被攻破。” 它会让账户难以被攻破,但并非不可能。钓鱼网站仍可能实时截获用户输入的验证码,这正是通行密钥存在的原因。
  • 只在浏览器中检查验证码。 如果服务器在输入密码后就发放了完整会话,那么验证码界面就只是摆设。服务器必须在第二因素通过之前拒绝访问。
  • 对验证码猜测次数不设限制。 六位数字有一百万种可能。如果没有速率限制和锁定机制,攻击者只需不断猜测。
  • 忘记恢复方式。 没有恢复码,每部丢失的手机都会变成一个支持工单,或导致客户被锁在门外。
  • 随意保存TOTP密钥。 共享密钥应当加密存储在数据库中,并且在设置完成后不再显示。
  • 允许用户随意关闭2FA。 关闭2FA或更改邮箱时,应当要求输入密码和当前验证码。
  • 以为“密码加安全问题”就是2FA。 并不是,两者都属于你知道的东西。

向你的AI搭建工具提出什么要求

  • “添加可选的双因素认证,使用验证器应用(TOTP),设置时显示二维码,并在正式启用前要求输入一次确认验证码。”
  • “启用2FA后显示十个一次性恢复码。像密码一样对它们进行哈希存储。”
  • “在服务器端强制执行2FA:第二因素通过之前,不得发放完整会话。”
  • “限制验证码尝试次数,多次失败后锁定登录15分钟,并在发生这种情况时向用户发送邮件。”
  • “管理员账户必须使用2FA。”
  • “在关闭2FA或更改账户邮箱之前,要求输入密码和当前验证码。”
  • “使用知名的库或我们认证服务商内置的2FA,不要自己编写加密代码。”
  • “说明你使用了哪种方式,以及密钥存储在哪里。”

如果你使用托管认证服务,请查看它是否已提供2FA或通行密钥;启用内置功能通常比自定义代码更安全。分步操作说明见如何添加双因素认证,而什么是身份认证则介绍了其背后的登录基础知识。

Mythex中的双因素认证

Mythex不包含供应用用户使用的内置登录系统,因此2FA属于你所选择的任何认证方式的一部分:可以是基于项目数据库的自有邮箱加密码登录,也可以是提供2FA的托管认证服务。你可以在聊天中请智能体添加它,而任何服务商密钥都应放在项目密钥中,而不是直接写在聊天里。为应用添加登录的文档配方提供了可调整的起始提示词,为你搭建的应用做好安全则介绍了与密钥相关的良好习惯。上线前,请按照AI搭建应用安全检查清单逐项核对。

常见问题

简单来说,什么是双因素认证?

双因素认证(2FA)指登录时需要两种不同类型的证明,通常是你的密码加上来自手机的验证码或安全密钥。仅仅窃取了你密码的人仍然无法登录。

2FA和MFA是一回事吗?

基本是。多因素认证(MFA)指两个或更多因素;双因素认证是其中最常见、恰好包含两个因素的情况。在日常使用中,这两个术语常被互换使用。

短信双因素认证安全吗?

它比只用密码要好得多,但却是常见选项中最弱的一种。短信可能被截获,或因SIM卡交换(SIM swapping)而被转移;钓鱼登录页面也可能骗取用户输入验证码。验证器应用更安全,而通行密钥或安全密钥则更加安全。

我的应用需要双因素认证吗?

如果账户涉及资金、私人数据,或对其他用户拥有管理权限,提供2FA是个好主意,而要求管理员使用也很常见。对于简单的业余应用,可以设为可选,或以后再考虑。

如果用户丢失了手机怎么办?

这正是恢复码的用途:在开启2FA时显示的一组一次性备用码。如果没有它们,通常只能由应用的所有者进行人工身份核实,因此请在上线前做好规划。

Mythex · Pricing · 用 AI 构建任何东西 · 网站和应用模板 · Mythex 对比 · AI 应用构建术语表 · 免费的 AI 应用构建工具 · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 繁體中文(香港) 繁體中文(台灣)