密钥托管规范
所有内置工具的加密标准:随机数据密钥 + 安全中心包装,改密码秒级完成
密钥托管规范(Managed Key Standard)
生效于 v1.1.0。以后任何新工具的加密一律采用托管方案,禁止“派生密钥直用数据加密”。
为什么用托管方案
两种方案的对比:
| 派生方案(已废弃) | 托管方案(标准) | |
|---|---|---|
| 数据密钥 | HKDF(主密钥, 工具id) | 随机 32B |
| 改安全密码 | 必须重加密全部数据文件 | 只重包装 1 个 wrapped key,秒级完成 |
| 数据加密强度 | 取决于密码熵 | 独立随机 256-bit |
安全性上两者最终都归结于安全密码强度,托管方案不弱于派生方案,但改密码成本从“重加密所有数据”降为“重包装一个密钥”——对大文件、多文件场景是决定性差异。
架构
安全密码 ──Argon2id──▶ 主密钥 MK(仅内存)
│ HKDF 派生
▼
工具包装密钥(toolId 派生)
│ AES-256-GCM
▼
<tool>_wrapped_key(随机数据密钥的密文,落盘 SharedPreferences)
│ AES-256-GCM
▼
数据文件/索引(随机密钥加密的密文)
新工具接入步骤
- 密钥注入:解锁安全中心后
unwrapManagedKey(toolId)命中 → 切换随机密钥,保留旧派生密钥作_legacyKey(迁移窗口双密钥读取)- 未托管 → 用派生密钥解密全部存量数据 → 随机密钥重加密 → wrapped key 最后写(完成标记,崩溃可重试,单文件失败跳过)
- 双密钥读取:解密先试主密钥,失败 fallback legacy(崩溃残留自愈);
clearKey()两者都零化 - 改密注册:
VaultMigrationService.migrateTool加 case——已托管 → 重包装 wrapped key;未托管 → 旧路径重加密数据 - 备份:
<tool>_wrapped_key加入备份白名单(同设备/同密码恢复可解);数据 box/目录加入备份类别 - 测试:迁移幂等(写存量 → 迁移 → 可读 → 再迁不破坏)、加密闭环、大文件分块、密文不泄露文件名
已落地工具
密码管理器、人物卡片、加密相机(含视频分块重加密 + 迁移进度 UI)、加密笔记、加密通讯录、AI 对话、文件保险箱——全部托管。
不需要托管的场景
- Hive box 级加密(Keystore 随机密钥,改密码无影响)
- 插件
encrypted_storage与插件 webview 派生密钥(改密靠retainedOldKey下发 + 插件侧重包装,JS 侧无法解 wrapped key)
通用约定
- 密钥只在内存,锁定/退出/切后台即零化
- 解锁流程统一:
unlock → getToolKey → ensureManaged → load - 备份恢复后密钥不匹配 → 锁屏必须给“放弃旧数据,重新开始”出路,禁止静默进入空状态