外观
VMax MVP 隐私边界与数据保留
1. 状态与保证边界
本文定义数据最小化、可见方和保留上限的设计基线,不替代隐私政策、App Privacy、法律审查或服务端/Push 的具体实现。
VMax 的目标是保护内容,不承诺隐藏全部元数据。网络、消息实例、Push Gateway、APNs 或合法接收端仍可能观察 IP、时间、频率、大小、实例域名、通知活动或最终明文。
2. 来源分类
v1.1 MUST
- 注册不要求手机号、邮箱、Apple 登录或通讯录权限。
- 服务端、对象存储、Push Gateway 不得获得消息明文、私钥或会话密钥。
- APNs payload 不得包含发送人、正文、会话 ID、完整实例域名或附件信息。
- 日志、崩溃、分析、诊断导出禁止消息内容、私钥、备份密码、完整地址、APNs token 和主/假密码材料。
- 各服务器 Profile、Real/Decoy 的数据、Keychain 与通知路由隔离。
- 举报只有在用户明确选择并确认后,才可把所选内容解密提交;默认不上传聊天内容。
说明书默认/建议
- 未送达密文默认 7 天、可配置 1 至 30 天;ACK 后立即删除、最长 1 小时清理。
- 脱敏服务日志默认 7 天;速率限制状态不超过 24 小时;客户端诊断日志本地保存 24 小时。
- 首发不集成第三方广告、行为分析或会话录屏 SDK。
这些保留值仍需 ADR-009、容量、滥用防护和法律要求共同确认,不能视为已部署事实。
3. 数据流与可见方
| 数据 | iOS 客户端 | 消息实例 | Push Gateway/APNs | 备份/外部位置 |
|---|---|---|---|---|
| 消息正文 | 端点明文;本地加密存储 | 不可见 | 不可见 | 用户选择包含时,仅在加密包内 |
| 密文信封 | 生成/接收 | 短期路由与离线存储 | Push Gateway 不接收 | 默认不需要 |
| 身份/设备私钥 | 仅本地封装保存 | 不可见 | 不可见 | 仅加密备份包 |
| 公开身份/预密钥 | 本地生成 | 为发现/握手保存 | 不可见 | 可包含于加密备份 |
| VMax 完整地址 | 用户界面/本地联系人 | 路由所需最小部分 | 禁止 | 加密包内可包含 |
| IP、时间、大小 | 网络栈可见 | 可观察 | 网关/APNs 可观察其链路 | 导出位置提供方可观察元数据 |
| APNs token | 本地系统接口 | 仅按 Push 架构受控处理 | 网关/APNs 可见 | 禁止进入备份/日志 |
| wake_route_id | 本地映射 | 仅提交随机引用 | 可见随机引用 | 不应备份为长期身份材料 |
| 主/假密码和 KDF 材料 | 仅本地受控存储 | 禁止 | 禁止 | 禁止进入聊天备份;独立恢复策略待决 |
| Decoy 状态 | 本地中性表示 | 禁止 | 不应可区分 | 不应暴露真实空间存在 |
PostgreSQL 是密文与投递状态的持久权威。Redis/队列只保存短期、可重建的协调状态,不能复制消息明文、私钥或形成长期关系图谱。S3 兼容对象存储在文本 MVP 不启用;未来附件必须由客户端独立加密后再上传,且文件名、MIME、尺寸和缩略图仍需单独做元数据最小化。
4. 服务端与 Push 接口约束
具体 schema 交给服务端和 Push 任务;必须满足:
- 服务端只接收认证设备、收件设备引用、密文信封、大小、TTL、幂等和路由所需字段。
- 不以 URL query 传 token、完整地址或敏感标识;访问日志默认不记录 query 和 body。
- Push Gateway API 不得出现
envelope、消息摘要、联系人、会话或实例完整域名字段。 - wake_route_id 必须高熵、可轮换、用途受限;不能把设备 ID、VMax ID 或 APNs token 直接编码其中。
- Push Gateway 与消息实例的日志不能通过稳定全局标识轻易合并;必要关联使用短期、用途限定引用。
- 关闭官方 Push 后,前台仍可通过消息实例工作;后台延迟需明确告知,不能暗中恢复官方网关。
5. 保留与删除语义候选
| 数据 | 说明书基线 | 删除触发 | 可验证语义 |
|---|---|---|---|
| 未送达密文信封 | 默认 7 天,可配 1 至 30 天 | TTL 到期或收件设备 ACK | 业务表不可查询;清理延迟指标;底层物理擦除不保证 |
| 已 ACK 信封 | 立即,最长 1 小时清理 | 幂等 ACK 事务完成 | 重试不重复交付;超时告警 |
| 一次性预密钥公开部分 | 使用后立即删除/标记消费 | 原子领取成功 | 并发下至多一次有效消费 |
| 认证 challenge | 60 秒、单次 | 使用或到期 | 重放拒绝 |
| 幂等记录 | 待 ADR-009 | 重试窗口结束 | 不保留请求正文或密文副本 |
| 速率限制状态 | 不超过 24 小时 | 窗口结束 | 不演变为长期用户画像 |
| 服务日志 | 默认 7 天、脱敏 | 滚动过期 | 存储、备份和聚合端一致执行 |
| 客户端诊断日志 | 本地 24 小时 | 过期、格式化、用户清除 | 导出前二次脱敏预览 |
| 外部加密备份 | 用户控制 | 用户在外部位置删除 | App 不声称本地格式化可删除 |
“删除”必须区分:业务不可访问、逻辑删除、后台清理完成、备份过期和物理介质覆写。VMax 只能声明实际验证到的层级。
6. Real/Decoy 与跨 Profile 隐私
- Decoy 不加载真实数据库、身份、联系人、服务器配置、Push 路由、搜索索引、分享历史或诊断记录。
- 真实通知摘要不能进入 Decoy;进入 Decoy 时清除当前可见通知和 badge,后续只处理无内容唤醒。
- Spotlight、Siri 建议、Widget、分享扩展、键盘学习、剪贴板和系统备份均视为独立泄露面;若无法证明隔离,首版默认关闭相关集成。
- Profile 切换关闭旧连接、清理会话对象并重建依赖容器;缓存 key 必须包含不可碰撞的 Profile 内部标识。
- 不能承诺 Decoy 对有设备取证能力的攻击者完全不可区分;存储大小、Keychain 项数、通知时序和外部备份可能暴露痕迹。
7. 日志 分析 崩溃与诊断
允许的服务端字段应限于 timestamp、level、service、request_id、路由模板、状态码、延迟和稳定错误码;actor 使用短期、轮换、作用域限定哈希。
禁止:
- 消息正文、密文全值、协议秘密、私钥、口令、派生值;
- access token、APNs token、完整 VMax 地址、完整 IP 长期历史;
- 伪装槽位命中、格式化触发或能直接证明 Real/Decoy 关系的事件名;
- 本地备份路径、联系人名、通知正文和剪贴板内容。
错误对象和默认 description 也属于日志面。结构化日志 API 应使用字段白名单,而不是事后正则脱敏作为唯一防线。
8. 用户权利与透明度
- 设置页展示当前实例、保留策略、Push 模式和外部备份边界。
- 删除身份前分别说明:本机密钥/数据、实例队列、联系人端历史和外部备份的不同结果。
- 举报流程预览将要解密提交的内容、接收者和不可撤回后果。
- 诊断导出先生成本地预览,允许用户取消;默认不包含内容或稳定身份标识。
- 隐私政策不得把“服务器不读正文”扩写为“不收集任何元数据”。
9. 待总控决策
- ADR-009 冻结 TTL、ACK 清理、幂等记录和备份过期窗口。
- ADR-006 冻结官方 Push、私有消息实例和完全主权部署的隐私模型。
- 是否允许任何遥测;推荐 MVP 默认无第三方分析,若引入必须显式 opt-in、字段白名单和单独 DPIA/隐私评审。
- 系统备份是否排除真实数据库和 Keychain 项,以及用户如何恢复;由 iOS/备份任务实测。
- 外部
.vmaxbak的文件名、元数据和内容选择是否会暴露身份;由 ADR-007 处理。
10. 验证
- 抓包确认客户端密码、明文和禁止字段不出站;检查代理、重定向和错误重试。
- 扫描服务端、网关、反向代理、数据库、备份、崩溃包和诊断导出。
- 用两个 Profile 和 Real/Decoy 做搜索、通知、分享、缓存、剪贴板、后台快照的交叉矩阵。
- 让 TTL、ACK、日志轮转和失败重试经过真实时间/加速时钟测试,并断言数据变化。
- App Privacy、隐私政策、运行时权限和实际 SDK/SBOM 对照;不只检查文案。