news 2026/10/16 1:12:13

Monica安全模型深度解析:本地优先密码管理如何做到AES-256-GCM加密不落地

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Monica安全模型深度解析:本地优先密码管理如何做到AES-256-GCM加密不落地

【免费下载链接】Monica

Monica Pass,Password Management, 2FA Generator

项目地址:https://gitcode.com/gh_mirrors/monica5/Monica
点击查看免费下载

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 中。每次写入字段时,加密流程是:

  1. 用 32 字节的随机主数据密钥(MDK)初始化AES/GCM/NoPadding加密器;
  2. 加密器自动生成 12 字节随机 IV(初始化向量),保证同样的明文每次加密结果都不同;
  3. 存储格式为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),密码错误时在昂贵的解密前就能快速拒绝。

七、给你的实践建议 🔐

  1. 主密码要长且独特:它是唯一能跨设备恢复全部数据的凭证,建议用 Monica 内置生成器创建一个 19 位以上的短语密码。
  2. 开启生物识别:走 TEE 硬件通路的解锁体验更快,且新录入指纹会使旧密钥永久失效——这是防止"指纹被复用"的硬性保证。
  3. 设置自动锁定:默认 5 分钟自动锁定,配合屏幕保护即可兼顾安全与便利。
  4. 备份密码 ≠ 主密码时,务必离线记下:WebDAV 备份密码是第二套独立凭据,丢失它同样无法读取云备份。
  5. 设置恢复问题:作为忘密码时的辅助确认手段(答案仅存 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

项目地址:https://gitcode.com/gh_mirrors/monica5/Monica
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 1:12:12

VulnHub TR0LL:2靶机实战:从信息收集到Root提权全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:12:11

Android文件读写全攻略:从Java IO到MediaStore与SAF

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:11:26

双串联锂电池主动均衡设计与工程落地要点

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:10:43

2024 Go面试高频题精讲:Goroutine与Channel实战指南

简介:2024年最新Go语言面试30题及答案讲解,聚焦Go核心考点,适合求职面试者、在校学生以及希望系统巩固Go基础的开发者。题目覆盖Go语言特点、Goroutine轻量级线程、Channel通道通信、select多路复用、接口与空接口、错误处理、defer执行顺序及…

作者头像 李华
网站建设 2026/10/16 1:10:29

金融数据竞赛小白实战复盘:从逻辑回归到LightGBM的提分之路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 1:09:52

Qoder Skill功能实战:从配置到进阶,打造AI编程上下文管理利器

1. 为什么我会花一整周去啃Qoder的Skill功能先说结论:Qoder的Skill功能是我最近半年里遇到的、少数让我觉得"这工具设计者是真的自己写代码"的功能模块。这东西表面上是一个"给AI预处理指令"的配置面板,但实际用下来,它解…

作者头像 李华