访问策略、共享钥匙串与 Face ID
保存同一个秘密,解锁后读取、后台读取、跨应用共享和跨设备同步,是四种不同的设计决策。
用你的前端经验理解
可以用“何时允许读、谁能读、复制到哪里”理解 Keychain 属性。Face ID / Touch ID 是本机用户验证,不等于 OAuth 登录。
为什么需要它
敏感数据不只有“存或不存”的选择,还要决定何时允许访问以及是否允许迁移。仅前台解锁后需要的凭证与后台任务要读取的凭证,访问策略可能不同。先描述真实业务时机,再选择满足需求的最严格策略;不要为了减少一次读取失败就放宽所有条目。
它是怎样工作的
设备解锁条件、ThisDeviceOnly 迁移属性与额外用户在场校验是不同维度。Face ID 或 Touch ID 校验确认的是当前设备上的访问条件,不会自动向你的后端证明业务账号身份。共享 Keychain 还需要匹配的 access group 与签名授权;App Group 文件共享不能代替 Keychain access group。
把关键概念连起来
何时能读
kSecAttrAccessible 控制锁定状态下的可用性,例如 WhenUnlocked 与 AfterFirstUnlock。带 ThisDeviceOnly 的策略不迁移到另一设备,不能与可同步条目组合;按实际场景选择最小需要。
谁能共享
Keychain access group 允许具有匹配签名权限的应用访问指定条目;App Groups 常用于共享文件/偏好。kSecAttrSynchronizable 则涉及 iCloud Keychain 同步,三者职责不同。
本机认证
LocalAuthentication 用于 Face ID / Touch ID 等本机验证;保护特定秘密时可结合 Keychain access control。Passkeys 则是与服务域绑定的公钥登录凭证,服务端仍要验证挑战。
锁定的私人日记
打开日记时进行本机验证,读取受访问控制保护的密钥;失败或取消保持锁定。若需要登录服务端,仍使用独立业务会话。小组件只展示非敏感摘要。
保护需要再次确认才能使用的敏感条目
- 先决定敏感动作是否必须由用户主动触发,避免后台流程等待一个没有界面承接的认证窗口。
- 创建条目时设置明确访问控制,读取时处理用户取消、生物识别不可用以及策略不满足等结果。
- 如果选择绑定当前生物识别集合的策略,要设计系统录入变化后的恢复路径,不能假定凭证永远可读。
这里需要你亲自判断
不要以“弹过 Face ID”代替服务器身份验证;也不要把设备会话令牌默认设为跨设备同步。用户取消和认证不可用都是正常路径。
做一个小练习
分别为前台解锁日记、后台上传和主 App/扩展共享凭证设计访问策略,解释是否需要同步。
- 比较前台解锁凭证与后台刷新凭证的访问需求,并说明为何不能使用同一默认策略。
- 用户取消本机认证时,保证敏感动作不执行且账号不会被误删。
展开参考思路与验收标准
本机解锁、凭证存储和业务授权是三层。系统允许读取某条秘密,不等于服务器仍认可它;更严格的策略需要可解释的恢复方案。