外观
ADR-011 双密码伪装与格式化
- 状态:提议,待总控决策
- 日期:2026-09-23
- 决策范围:本地 App Lock 双密码路由、Decoy 数据隔离、可选密码学擦除及崩溃恢复
- 关联:ADR-005、ADR-007、
docs/security/双密码与伪装空间.md、docs/security/本地格式化与密码学擦除.md
背景
v1.1 把本地双密码列为 MVP:主密码进入真实空间,假密码进入独立空白空间;“假密码触发格式化”可选且默认关闭。格式化必须避免误触、优先删除关键密钥,并明确不保证 NAND 物理覆写或外部备份删除。
当前没有 iOS 实现,Keychain/Secure Enclave、数据库和系统扩展行为尚未验证。
不可变产品与安全约束
- 主/假密码不参与服务端认证或同步。
- 两槽独立盐和内存困难 KDF;口令不直接作为数据库密钥。
- Decoy 是独立容器,不是隐藏真实列表。
- 格式化默认关闭;启用需主密码 + 不可逆警告 + 二次确认。
- 只有精确假密码验证成功触发;错误、Face ID、取消、后台和系统终止没有触发边。
- 本地删除不等待网络;外部备份和远端 TTL 数据不在保证内。
决策分项
1 双密码凭据结构
选项:
- A 两个固定长度中性槽,各自通过 KDF 解封对应能力;假槽从不含 Real 解封材料。
- B 保存两个 verifier,命中后再访问独立 Keychain 项。
推荐:A,减少独立 verifier 和显式槽位分支;要求同版本、相近 KDF 工作量和中性键名。是否能用目标 iOS API 安全实现,待 ADR-005/iOS spike。
2 Decoy 形态
选项:
- A 自然空白 Profile:无身份、联系人、会话、服务器和备份记录。
- B 可长期使用的伪装身份/聊天空间。
推荐:MVP 选择 A。B 会扩大消息、Push、备份、账户和一致性范围,不应在本 ADR 暗中加入。
3 格式化崩溃恢复
选项:
- A 中性、完整性保护的阶段记录 + 幂等协调器。
- B 仅依赖多项 Keychain 删除和文件尽力清理。
- C 无记录的一次性删除。
推荐:A。它更可测试且能在 crash 后继续安全收敛;阶段记录可能暴露维护行为,是明确剩余风险。B/C 无法证明跨 Keychain 与文件系统的原子性。
4 Face ID
推荐:仅作为 Real 的可选快捷解锁;永不触发 Decoy 或格式化。用户可直接选择输入密码,并可在设置关闭生物识别。
提议的状态机

放大查看矢量图。只有“预先启用且假密码精确验证成功”能进入橙色协调器;普通错误和锁屏时的取消、退后台、系统终止没有删除边。进入协调器后的中断恢复方案仍待本 ADR 批准和真机验证。
text
Locked
+ main authenticated -> RealUnlocked
+ decoy authenticated + erase off -> DecoyUnlocked
+ decoy authenticated + erase on -> EraseCoordinator -> DecoyUnlocked
+ invalid/cancel/biometric failure/background -> LockedEraseCoordinator:
text
Idle -> ArmedIntentPersisted -> RealAccessQuiesced
-> CriticalUnwrapMaterialDeleted -> CriticalDeletionVerified
-> SandboxCleanupPending -> DecoyReady损坏/未知状态保持 Locked,不猜测删除;关键材料一旦验证删除,不因文件清理失败恢复 Real。
数据隔离要求
Real 与 Decoy 独立数据库/WAL/SHM、附件、缓存、临时文件、Keychain 命名空间、依赖容器、搜索索引、分享数据、服务器对象和通知显示状态。
AppUnlock 只返回 real / decoy / invalid 等强类型结果。业务 UI 不读取 verifier;格式化 API 只接受 decoyAuthenticatedAndEraseEnabled 授权枚举。
对外声明边界
- 可说:假密码进入独立空白空间;用户可选本地格式化;格式化优先删除关键密钥。
- 必须同时说:不保证 NAND 物理覆写;不删除 App 外部备份、对端副本或服务器 TTL 内密文。
- 不得说:绝对无法恢复、完全不可被取证发现、胁迫者一定无法识别、与任何第三方产品同等级。
验证门槛
- 格式化关闭时,假密码连续 100 次,Real 密钥、数据库和身份公钥无变化。
- 开启时只有精确假密码成功触发;所有其他输入路径的删除调用为零。
- 每个协调器步骤前后 kill/relaunch;最终仅允许“Real 完整可用”或“Real 不可解封并进入 Decoy”。
- 扫描 Keychain 历史命名空间、数据库/WAL/SHM、附件、缓存、临时目录、通知和扩展容器。
- 两个以上服务器 Profile 的 Real/Decoy 交叉矩阵无泄露。
- 主/假/错误时序做真机统计;可稳定分类的差异必须记录,不宣称恒定时间。
- 独立安全评审和误触测试完成后才能发布。
影响
- 需要 AppUnlock、ProfileStore、SecureEraseCoordinator 和通知/扩展明确分层,但本 ADR 不授权生产实现。
- 中性阶段记录增强崩溃恢复,但增加可被取证观察的本地状态。
- 自然空白 Decoy 缩小 MVP 范围,但对长期观察者可能不够可信;这是产品边界,不通过伪造数据补偿。
待总控决策
- 接受上述四项推荐,或指定替代方案。
- 是否接受中性阶段记录的可区分性风险。
- 格式化开关、槽位记录和 Profile 主密钥的具体 Keychain/Secure Enclave 方案(依赖 ADR-005)。
- 系统备份、App Group、Notification Service Extension 和外部
.vmaxbak的最终范围。 - 是否在未来版本允许持久 Decoy 身份;MVP 推荐不允许。