Skip to content

ADR-011 双密码伪装与格式化

  • 状态:提议,待总控决策
  • 日期:2026-09-23
  • 决策范围:本地 App Lock 双密码路由、Decoy 数据隔离、可选密码学擦除及崩溃恢复
  • 关联:ADR-005、ADR-007、docs/security/双密码与伪装空间.mddocs/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 -> Locked

EraseCoordinator

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 推荐不允许。

系统初步设计 · 待决事项不代表批准 · 安全方案尚未完成独立审计