【免费下载链接】Monica
Monica Pass,Password Management, 2FA Generator
Monica 是一款开源的 Android 本地优先密码管理与 2FA 生成器应用。它的核心理念是"零知识保护":所有密码、信用卡、证件信息在落盘前都会经过 AES-256-GCM 认证加密,明文永远不会以可读形式出现在设备上。即使你的数据库文件被盗,没有主密码也拿不到任何数据。
一、总体架构:三层防线一图看懂
Monica 的安全设计可以概括为三层:
| 层级 | 保护对象 | 核心技术 |
|---|---|---|
| 数据层 | 数据库中的每条敏感字段 | AES-256-GCM 字段级加密 |
| 密钥层 | 加密数据用的"主数据密钥"(MDK) | 密码包裹 + Android KeyStore 硬件包裹 |
| 传输层 | WebDAV 云备份文件 | AES-256-GCM 文件级加密 |
这个分层思想在官方技术文档中有完整描述:本地存储与加密技术文档。
二、数据层:AES-256-GCM 字段加密,明文不落地
数据库本身使用 Room(SQLite)存储在应用私有目录/data/data/takagi.ru.monica/databases/,外部应用无权访问。但 Monica 不依赖这一道"围栏"——数据库里的敏感字段(如密码)存的不是明文,而是密文。
核心实现在 SecurityManager.kt 中。每次写入字段时,加密流程是:
- 用 32 字节的随机主数据密钥(MDK)初始化
AES/GCM/NoPadding加密器; - 加密器自动生成 12 字节随机 IV(初始化向量),保证同样的明文每次加密结果都不同;
- 存储格式为
MDK|Base64(IV + 密文)——前缀MDK|用于区分加密数据和普通文本。
为什么选 GCM 模式而不是 CBC?
GCM 是认证加密(AEAD):它不仅保证保密性,还附带 128 位完整性校验标签。任何人哪怕只翻转密文中的一个比特,解密时都会直接报错失败,而不是得到一段被篡改的"看似正常"的数据。这意味着篡改数据库密文没有任何攻击价值。
三、密钥层:MDK 的双重包裹
AES 加密需要密钥,那 MDK 本身存在哪?Monica 的答案是"双重包裹",两条独立通路都能还原出 MDK:
- 密码包裹:输入主密码 → PBKDF2WithHmacSHA256 迭代100,000 次(16 字节随机盐)派生出 AES 密钥 → 用 AES-GCM 解开密码包裹的 MDK。这是"忘记密码之外的唯一恢复路径",因此主密码是最后的安全底线。
- 硬件包裹:MDK 同时用 Android KeyStore 生成的硬件级 AES-256-GCM 密钥加密一份,密钥由 TEE/SE 保护,且设置了指纹/人脸授权(认证后 300 秒内有效)、"录入新生物特征即永久失效"策略。
主密码 ──PBKDF2(10万次)──> AES密钥 ──解密──> MDK ──AES-GCM──> 你的密码们 硬件Keystore(TEE) ───────────────────> MDK(生物识别解锁的快捷通路)设计上的关键细节:MDK 是一次性随机生成的,与主密码本身无关。所以即使有人拿走了数据库,暴力破解的只是 PBKDF2 哈希——而 10 万次迭代正是为了让这次破解成本高到不可行。密钥材料的完整生命周期见 SecurityManager.kt 的 MDK 初始化逻辑。
四、备份层:文件上传云端,密钥绝不上传
通过 WebDAV 备份时,Monica 会生成 ZIP 后整体加密,格式为:
[MONICA_ENC_V1 魔数][32字节盐][12字节IV][AES-GCM密文]- 派生算法同样是 PBKDF2-HMAC-SHA256(10 万次迭代 + 每次全新的随机盐);
- 即使两个用户使用相同备份密码,生成的文件也完全不同;
- 密码错误时,GCM 校验会抛出
AEADBadTagException,应用会明确提示"密码错误或文件损坏",而不是悄悄解出一堆乱码。
实现见 EncryptionHelper.kt。
五、安全网:600,000 次迭代的本地恢复信封
如果 Keystore 密钥丢失(换机、清数据),只有主密码包裹的 MDK 能救场。为了让这条通路更稳,Monica 在每次成功解锁后还会写入一个独立的恢复信封recovery.json:
- 保护算法升级到PBKDF2-HMAC-SHA256 600,000 轮(随机 32 字节盐),比日常验证迭代高 6 倍;
- AES-GCM 加密时附加 AAD(附加认证数据),文件结构被改动都无法通过校验;
- 信封内只存密文,任何明文密钥都不会落盘。
另有针对 Keystore 临时故障的启动容错:读取失败自动重试三次,已知损坏绝不会"自动重建"导致旧数据丢失(详见 secure-startup-318 验证记录)。
六、扩展保险库:MDBX 引擎的密钥派生
Monica 的 MDBX 扩展保险库采用独立但同样严谨的方案(MdbxVaultCrypto.kt):
- 凭据 = 主密码 + 可选密钥文件(
MONICA-MDBX-KEY-FILE-V1)组合,经 SHA-256 归一化后做 PBKDF2 派生(按性能档位 90,000 / 210,000 / 360,000 次迭代); - 派生密钥再包裹一个随机的"时期密钥"(epoch key),字段密文以
mdbx:v1:前缀 + JSON(nonce + 密文)存储; - 内置 HmacSHA256 校验器(verifier),密码错误时在昂贵的解密前就能快速拒绝。
七、给你的实践建议 🔐
- 主密码要长且独特:它是唯一能跨设备恢复全部数据的凭证,建议用 Monica 内置生成器创建一个 19 位以上的短语密码。
- 开启生物识别:走 TEE 硬件通路的解锁体验更快,且新录入指纹会使旧密钥永久失效——这是防止"指纹被复用"的硬性保证。
- 设置自动锁定:默认 5 分钟自动锁定,配合屏幕保护即可兼顾安全与便利。
- 备份密码 ≠ 主密码时,务必离线记下:WebDAV 备份密码是第二套独立凭据,丢失它同样无法读取云备份。
- 设置恢复问题:作为忘密码时的辅助确认手段(答案仅存 SHA-256 哈希)。
八、常见问题
Q:把数据库文件拷出来能看到密码吗?不能。字段全部是MDK|前缀的 AES-GCM 密文,且 MDK 只由你的主密码或本机硬件密钥还原,文件被拷贝走毫无意义。
Q:主密码会被 Monica 记录或上传吗?不会。应用只保存主密码的 PBKDF2 哈希值(且存放在经 AES-256 加密的 EncryptedSharedPreferences 中),本地优先架构下数据也不经过任何第三方服务器。
Q:忘记密码就永远丢失了吗?若从未设置恢复问题且没有备份密码,是的——这正是"零知识"的含义:厂商也无法帮你找回。这也是为什么强烈建议妥善记录主密码或配置 WebDAV 备份。
结语
Monica 用一条清晰的设计主线回答了"本地优先如何做到安全":明文只在内存中短暂存在,密钥由密码与硬件 Keystore 双通道守护,完整性由 GCM 认证标签兜底。从单条字段到整个备份文件,每一层都经得起"文件被盗"的假设——这也是你选择密码管理工具时最该追问的那个问题。
【免费下载链接】Monica
Monica Pass,Password Management, 2FA Generator
相关推荐
终极指南:KeePassX安全密码管理的AES-256位加密技术解析
终极指南:KeePassX安全密码管理的AES 256位加密技术解析 在数字时代,密码安全已成为保护个人信息的第一道防线。KeePassX作为一款跨平台的开源密
桌面应用应用安全Keepass2Android安全机制深度解析:AES-256加密与密钥管理
作为一款功能强大的安卓密码管理器, Keepass2Android 采用了业界领先的 AES 256加密 技术来保护用户数据安全。这款开源应用通过多层次的安全机
移动开发应用安全密码学OmniRoute 安全模型深度解读:从漏洞披露到 AES-256-GCM 加密与 Guardrails 防护体系
OmniRoute 安全模型深度解读:从漏洞披露到 AES 256 GCM 加密与 Guardrails 防护体系 本文围绕开源项目 OmniRoute 的官方
后端API网关LLM 网关人工智能大模型MCP 服务桌面应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考