外观
本地格式化与密码学擦除设计
1. 定义与边界
“本地格式化”是:在用户预先启用并精确输入假密码后,优先删除解封真实 Profile 所需的关键密钥材料,再清理 App 沙箱内可控数据。
它不等于:
- 对 iPhone NAND 做物理覆写;
- 删除 Files、iCloud Drive、AirDrop 或其他设备上的外部
.vmaxbak; - 立即删除接收方设备内容或服务器 TTL 内密文;
- 抵抗已完全控制操作系统或在触发前已复制明文/密钥的攻击者。
产品文案只能使用“本地格式化/密码学擦除”,不得使用“物理擦除”“无法恢复全部痕迹”等承诺。
2. 来源分类
v1.1 MUST
- 默认关闭;启用前重新验证主密码、展示不可逆影响并二次确认。
- 只有精确假密码验证成功触发;普通错误、空输入、Face ID 失败、取消、退后台或系统终止均不得触发。
- 先销毁数据库主密钥、身份/设备私钥封装和会话关键材料,再清数据库、WAL/SHM、附件、缓存、临时文件、诊断日志和通知。
- 本地格式化不得等待网络成功;完成后保持在空白 Decoy/首次启动状态。
- 任一步骤被终止后,重新启动必须安全收敛,不能出现一半明文/一半可恢复状态。
当前已验证事实
- 当前没有实现;尚未验证 Keychain、Secure Enclave、文件保护、通知中心或系统备份的删除行为。
- iOS 闪存和磨损均衡使 App 无法证明物理扇区覆写,这是明确的不保证项。
3. 前置条件
同时满足以下条件才可开始:
- 用户已在 Real 解锁状态主动打开开关;
- 本次设置重新验证主密码;
- 用户查看不可逆影响和外部备份边界;
- 用户进行第二次明确确认;
- 假密码已配置且与主密码不同;
- 当前解锁提交由 AppUnlock 返回不可伪造枚举
decoyAuthenticatedAndEraseEnabled。
任一配置损坏、版本未知或状态不完整都应禁用触发并保持锁定,不能“按更安全处理”而自动删除。
4. 崩溃安全状态机候选
text
Idle
-> ArmedIntentPersisted
-> RealAccessQuiesced
-> CriticalUnwrapMaterialDeleted
-> CriticalDeletionVerified
-> SandboxCleanupPending
-> DecoyReady4.1 中性意图记录
在删除前写入经过完整性保护、语义中性的本地维护记录,至少包含操作版本、目标 Profile 内部随机标识、阶段和重试计数。只有假密码验证成功后的受控路径能创建。
- 写入失败:中止,不删除任何关键密钥,保持 Locked。
- 记录存在:下次启动在初始化任何 Real 组件前恢复协调器。
- 记录损坏或未知版本:保持 Locked,进入本地恢复/支持路径;不得猜测并删除。
记录可能被取证识别,不能宣称其实现可否认性。若审计认为记录本身风险不可接受,需选择等价的事务机制并证明崩溃安全。
4.2 关闭 Real 访问
- 阻止新的 Real 解锁、数据库和网络任务。
- 取消 WebSocket、后台刷新、通知摘要处理和附件任务。
- 释放 Real 依赖容器;对可控秘密缓冲做尽力清理。
此步骤不算格式化成功,也不依赖向服务器发请求。
4.3 删除关键解封材料
按最终密钥层级删除:
- Profile Data Master Key 的所有有效封装/Keychain 项;
- 身份和设备私钥的独立封装材料;
- 仍可恢复会话根/链状态的关键材料;
- 可能绕过上述层级的恢复令牌或备用封装。
删除操作必须幂等。不存在视为已删除;权限/系统错误视为未完成并重试。
4.4 验证不可解封
- 重新枚举所有版本和历史命名空间,不只检查当前键名。
- 尝试按正常路径解封,必须失败为“材料不存在/已失效”,而非暂时系统错误。
- 只有验证完成,才把状态推进为
CriticalDeletionVerified。
若验证失败,保持 Real 不可加载的锁定/中性界面,并继续受控重试;不得显示“已完成”。
4.5 清理沙箱数据
清理集合至少包括:
- 主数据库、WAL、SHM、迁移副本、备份副本;
- 附件、缩略图、头像、草稿、导入暂存、下载和临时文件;
- URLCache、WebKit/系统缓存中由 App 可控的相关项;
- 本地诊断日志、崩溃前暂存、搜索索引和分享扩展容器;
- 当前可见通知、待处理本地通知和 badge;
- Real Push 路由的本地映射(服务端撤销仅作后续最佳努力)。
文件清理失败不恢复 Real 密钥。记录保留 SandboxCleanupPending 并在后续启动重试。
4.6 进入 Decoy
仅使用独立 Decoy 容器;不得因清理需要打开 Real 数据库。UI 展示自然空白/首次启动状态,不出现格式化进度、成功、假密码或真实 Profile 提示。
5. 待总控决策 01 崩溃恢复机制
| 选项 | 优点 | 风险 | 验证 |
|---|---|---|---|
| 中性阶段记录 + 幂等恢复 | 可逐步测试和重试;可证明安全收敛 | 记录可能暴露维护/擦除痕迹 | 每阶段 kill、记录损坏、重放测试 |
| 单一 Keychain 原子代际切换 | 可减少显式阶段文件 | Keychain 多项删除并非跨项事务;文件清理仍异步 | 真机故障注入、历史命名空间枚举 |
| 无记录尽力删除 | 实现简单 | 崩溃后无法证明状态,可能重新加载残留 Real | 不推荐 |
推荐:中性阶段记录 + 幂等恢复;记录的可区分性作为明确剩余风险。最终格式和存储位置由 iOS 安全评审冻结。
6. 网络与服务端边界
- 本地关键密钥删除不等待注销、撤销、Push route 删除或服务器响应。
- 本地完成后,可排队发送设备撤销/路由删除的最佳努力请求;请求失败不能恢复或阻塞本地结果。
- 服务端仍按 TTL、ACK 和数据保留策略处理密文;不能将本地格式化描述为“远程删除消息”。
- 具体接口由服务端/Push 任务设计,只需支持幂等、最小信息和不泄露伪装事件语义。
7. 误触防线
- 删除 API 不对 UI 或通用错误处理公开,只对受控协调器开放。
- 协调器输入为强类型授权,不接收密码字符串、槽位数字或多个可被误组装的布尔值。
- Face ID、主密码成功、错误密码、迁移失败、数据库损坏、连续失败次数和远程命令都没有通往格式化的边。
- 开关配置采用明确版本和校验;未知/损坏值解释为“关闭”,同时提示用户在 Real 设置中修复。
- 自动化测试对所有非触发事件断言:关键 Keychain 项、数据库哈希和身份公钥均未变化。
8. 验证计划
正常与边界
- 格式化关闭/开启;主密码/假密码;最长/最短允许口令;两个以上 Profile。
- Real 数据库为空、超大、WAL 有未检查点事务、附件清理中、通知堆积。
故障注入
- 在每个状态转移前后强制 kill;设备重启;磁盘满;Keychain 暂时不可用;文件权限错误;通知清除失败。
- 对每个历史密钥命名空间、数据库副本和共享容器注入残留。
- 网络完全离线、服务端 5xx、Push Gateway 不可用。
断言
- 非精确假密码路径的关键数据和密钥变化为零。
- 一旦
CriticalDeletionVerified,正常/恢复/旧版本路径均不能解封旧 Real 数据。 - 重启只会继续向
DecoyReady收敛,不会加载 Real。 - 沙箱、Keychain、WAL/SHM、缓存、临时目录、通知和扩展容器残留扫描通过。
- 外部备份仍存在时,UI/发布说明准确说明其不在范围内。
9. 发布门槛与审计问题
- 双密码、伪装和格式化独立安全评审完成;误格式化为 0。
- 真机故障注入覆盖所有状态边,不只使用模拟文件系统。
- 审计 Keychain/Secure Enclave 删除语义、系统备份、App Group、扩展和升级遗留命名空间。
- 确认中性状态记录不会被普通日志、分析或诊断导出暴露。
- 产品、隐私和支持文案不承诺物理擦除,不声称删除外部备份或远端副本。