为什么苹果会把验证码发到当前设备?聊聊 Apple 身份认证这些年的演进

TL;DR:苹果验证的不是验证码,而是「你是否拥有一台受信任设备」。验证码只是授权流程中的确认码,并非第二因素本身。对于只有一台设备的用户,当前设备就是唯一的受信任设备。

很多人第一次使用 Apple ID 双重认证时,都会有一个疑问:

验证码都发到当前设备了,这还有什么安全意义?

我以前也一直没想明白。

后来查阅了 Apple 和 FIDO Alliance 关于 Passkey 的设计资料之后,我发现:

这个问题本身没有错,只是我们一直用传统 2FA 的思维,在理解 Apple 完全不同的一套认证体系。


结论

苹果验证的不是:

「你能不能收到验证码。」

而是:

「你是不是拥有一台受信任的 Apple 设备(Trusted Device)。」

验证码只是一次登录授权流程中的确认码。

因此,对于只有一台 Apple 设备的用户来说:

当前设备,就是唯一的受信任设备。

所以验证码出现在当前设备,并不是漏洞,而是苹果认证模型的设计结果。


身份认证,其实一直在解决上一代的问题

如果把整个身份认证的发展放在一起看,就很容易理解苹果为什么这么设计。

方案解决的问题新的问题
密码身份认证密码泄露、重复使用
短信验证码增加第二因素SIM 换卡、短信劫持、运营商成本
TOTP(Authenticator)不依赖短信需要备份、迁移、恢复
Apple Trusted Device不需要短信,不需要 Authenticator,可单设备完成当前设备授权容易引起误解
Passkey去掉密码、去掉验证码、抗钓鱼依赖生态支持(已逐渐普及)

其实每一代方案,都不是推翻上一代,而是在解决上一代留下的问题。


Apple 为什么没有采用传统 2FA?

传统双因素认证通常都是:

1
2
3
密码
+
另一台设备上的验证码

因为:第二因素最好来自另一台独立设备。这样即使电脑被攻击,攻击者也拿不到验证码。

这是很多银行、企业系统今天依然采用的方案。

但是 Apple 面对的是几十亿普通用户。它必须考虑:

  • 第一台 iPhone
  • 只有一台 Mac
  • 出门只带一台 iPad
  • 老年用户
  • 账号恢复

如果坚持验证码必须来自另一台设备,很多用户甚至无法登录自己的 Apple ID。

因此苹果做出了一个不同的选择:验证受信任设备,而不是另一台设备。

也就是说,只要这台设备已经建立了信任关系,它就可以完成整个授权流程。

这也是为什么验证码有时会显示在当前设备。


Apple 真正追求的是易用性

很多人觉得苹果这种设计是在牺牲安全。

我反而觉得:苹果是在追求普通用户也愿意使用高安全认证。

相比传统方案,Apple 的认证几乎没有额外负担:

  • 不需要短信
  • 不需要安装 Authenticator
  • 不需要保存 TOTP 种子
  • 不需要手动迁移验证码

整个过程,几乎都是系统自动完成。

对于普通用户来说,这比传统 2FA 简单太多了。


Passkey 才是真正的下一步

随着 Passkey 出现,苹果终于把最后一块拼图补齐了。

传统 Apple ID:

1
2
3
4
5
密码
+
受信任设备
+
验证码

Passkey:

1
2
3
4
5
受信任设备
+
Face ID / Touch ID
+
私钥签名

Face ID(或 Touch ID)验证的是:此时此刻操作设备的人,就是设备主人。

Secure Enclave 随后使用私钥完成签名。

因此:密码没有了。验证码也没有了。

整个登录过程几乎变成:Face ID。完成。


iCloud 同步,才是 Passkey 最大的优势

我认为,真正让 Passkey 成熟的,并不是 Face ID,而是 iCloud Keychain

过去,TOTP 最大的问题其实不是安全,而是:

  • 换手机要迁移
  • 忘记备份
  • 手机坏了账号恢复困难
  • 需要保存恢复码

管理成本非常高。

而 Passkey 在 Apple 生态里变成了:

1
2
3
4
5
6
Secure Enclave 生成私钥

iCloud Keychain 端到端加密同步

Mac / iPhone / iPad / Vision Pro
自动拥有同一套 Passkey

这里同步的不是密码,而是经过端到端加密保护的 Passkey。

于是苹果第一次真正做到:既安全,又几乎不用用户管理。

这是过去几十年身份认证一直很难兼得的事情。


安全设计,从来都是权衡

有人会说:如果电脑完全被攻破,独立设备验证码是不是更安全?

答案是:是。

物理隔离,永远是一种安全。

所以政府、企业管理员、高安全行业,今天依然大量使用:

  • 硬件安全密钥
  • 独立认证设备

但是苹果面对的是几十亿普通用户。它需要的是整体最优,而不是某一种攻击模型最优。

因此苹果每一代身份认证,其实都在做同一件事情:

在安全性、易用性、恢复能力之间不断寻找新的平衡。


最后

现在再回到最初那个问题:为什么苹果会把验证码发到当前设备?

答案其实已经很简单了。

因为苹果验证的,从来不是验证码,而是受信任设备。

验证码只是那个时代,完成授权流程的一种方式。

而随着 Passkey、Secure Enclave、Face ID 和 iCloud Keychain 的成熟,苹果终于把整个认证流程进一步简化成:

拥有设备 + 证明现在就是你。

用户几乎感觉不到复杂的密码学、密钥管理和同步机制。

这恰恰是我认为苹果这些年身份认证设计最成功的地方。

真正优秀的安全设计,不是让用户做更多,而是让用户几乎感觉不到安全本身。

这篇文章是通过 ChatGPT 协助生成的。