FaceID/TouchID应用安全性、工作原理及关联MFA服务机制问询
问题2:结合MFA服务与FaceID/TouchID的身份验证机制
你的核心猜想方向是对的,但实际落地有一些细节优化,我来拆解清楚:
实际工作流程
- 首次验证绑定:
输入手机号后,MFA服务发验证请求(短信/APP推送等),输入PIN码验证通过后,应用会从MFA服务拿到那个等效“社会安全号码”的全局用户ID——这是服务端唯一标识你身份的核心凭证。有些应用让你设置的本地PIN码,是用来和全局ID绑定,或是作为本地解锁的二次验证,而非直接传给服务端。 - 本地凭证存储:
应用会把全局用户ID和经过处理的PIN码(比如加盐哈希后的结果,而非原始PIN)存到系统的Keychain里——Keychain是iOS/macOS提供的系统级加密存储,只有当前应用能访问,默认需要FaceID/TouchID验证才能取出内容。 - 后续登录验证:
打开应用时触发FaceID/TouchID验证,通过后应用才能从Keychain取出全局用户ID和哈希PIN(或加密凭证),再调用MFA服务的API完成身份验证。这里的关键是:FaceID/TouchID只是解锁本地存储的凭证,服务端认的还是它自己签发的全局ID和验证过的PIN凭证。
关于4位PIN码的安全性疑问
4位PIN确实只有10000种组合,但实际很难被暴力破解,原因有三点:
- 服务端限流机制:正规MFA服务的API都会有严格限流,比如连续输错3-5次就锁定账户15分钟,甚至封禁IP,暴力破解需要上万次尝试,时间成本和失败风险极高。
- 本地存储保护:PIN码(或其哈希)存在Keychain里,必须通过FaceID/TouchID验证才能取出,就算手机丢失,别人也没法直接拿到PIN码去调用API。
- API权限控制:公开API不代表任何人都能随便调用,大多数服务会要求请求携带应用签名、API密钥或设备标识,只有授权应用才能发起验证请求,不是随便发个HTTP请求就能尝试破解的。
你的补充猜想:用密钥加密PIN码延长长度
这个思路非常靠谱,而且很多应用已经在这么做:
- 应用会在本地生成随机对称密钥,用它加密全局用户ID和PIN的组合(或直接加密PIN),再把加密后的数据存到Keychain。就算Keychain意外泄露,没有本地密钥也无法解密出原始凭证。
- 还有更安全的方案:首次验证后,服务端生成长期有效身份令牌(比如JWT),应用加密后存到Keychain,后续登录用FaceID/TouchID解锁令牌再传给服务端——这样连PIN码都不用在本地存储,安全性更高。
内容的提问来源于stack exchange,提问作者qwertyasdf




