# MarkLock **Repository Path**: Witson/MarkLock ## Basic Information - **Project Name**: MarkLock - **Description**: No description available - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-07 - **Last Updated**: 2026-10-12 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MarkLock **可加密的 Markdown 查看 / 编辑器** · 本地优先 · 零上传 [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE) ![Platform](https://img.shields.io/badge/platform-macOS%20%7C%20Windows-lightgrey) [![Release](https://img.shields.io/github/v/release/WitsonX/MarkLock?label=release)](https://github.com/WitsonX/MarkLock/releases/latest) **简体中文** · [English](README.en.md) --- Tauri 2 桌面应用:前端 Vue 3 + Ant Design Vue,壳与加密核心用 Rust。 所有数据只存本地,文件落盘即密文,**密钥永不出设备、不进 JS、不上传**。 ## 下载 从 [Latest Release](https://github.com/WitsonX/MarkLock/releases/latest) 获取安装包,文件名按平台选即可;国内网络可改从 [Gitee 发行版](https://gitee.com/Witson/MarkLock/releases) 下载(Gitee 有除离线包外的全部安装包)。 - 默认 Windows 包只有 3.5MB(WebView2 运行时安装时联网下载);机器没有 WebView2 又连不上微软 CDN 时,改用 `*-setup-offline.exe`(约 209MB,全程免网)。Win11 和更新过的 Win10 一般自带运行时,用默认包就够。 - 离线包只在 GitHub 提供(Gitee 附件单文件限 100MB);Gitee 侧可先装官方 [WebView2 运行时](https://go.microsoft.com/fwlink/?linkid=2124701) 再装小包。 > 安装包未走 Apple 公证,首次打开提示「Apple 无法验证」属固定流程,放行只需一次:弹窗点「完成」→「系统设置 → 隐私与安全性 → 安全性」里点**「仍要打开」**→ 输密码,之后同一位置不再询问(部分版本右键 → 打开 也可)。若提示「已损坏」,是旧构建未做资源密封,执行 `xattr -dr com.apple.quarantine /Applications/MarkLock.app` 即可。Windows 同样未签名,SmartScreen 里点「更多信息 → 仍要运行」。 ## 界面 **启动与解锁** ![unlock](doc/screenshots/unlock.png) **主编辑器**(分屏预览 + 侧边栏库树) ![editor](doc/screenshots/editor.png) **设置 → 安全与加密** ![settings](doc/screenshots/settings.png) ## 核心概念 | 概念 | 说明 | |---|---| | 加密库 `.mdlb` | 一个**单文件容器**(MarkLock Bundle),内部是一棵加密的文件树——文件名、目录结构、正文全部密文,磁盘上只有一个不透明的 `.mdlb` 文件,可整体放进 iCloud / Dropbox / 移动硬盘同步 | | 加密文件 `.mdl` | 单个加密的 Markdown 文件(MarkDown Lock),也可独立存在(如桌面上的「投资记录.mdl」) | | 主密码 | 只存在于用户脑中,经 Argon2id 派生出 KEK,不落盘、不上传 | | DEK | 库/文件的随机数据密钥,由 KEK 包裹后存于文件头;单文件库全库共享一个 DEK,`.mdl` 单文件独立 DEK;改主密码只需重包裹 DEK,无需全文重加密 | ## 功能特性 - 加密库:新建 / 打开 / 最近列表 / 密码提示 / 失败次数限制;**库是单文件(.mdlb),内部支持文件夹**(任意层级嵌套),解锁一次后库内文件读写均复用库主密码、无需再次输入;文件名与目录结构全部密文 - 编辑:Markdown 源码编辑(语法高亮)、编辑 / 分屏 / 预览三种模式、格式化工具栏、自动保存(800ms 防抖加密落盘) - 新建:页签栏「+」直接开一个未落盘的空白草稿页签,保存时才选目标——存为独立加密文件 `.mdl`(选路径 + 填密码),或存入已解锁的加密库(可选目标文件夹,复用库主密码,无需再填密码);密码只需 1 位以上即可,输入时下方实时显示强度条(弱/中/强)供参考 - 右上角菜单:新增「新建文件」「新建加密库」入口;当前页签不在库内时额外显示「复制到加密库」(把当前文件内容另存一份到已解锁库,原文件不变);保存/复制时选目标库,目标库下拉里含「+ 新建库…」选项,选中后在下方就地展开库名/保存位置/主密码/确认密码表单,创建成功后自动选中新库继续保存 - 工作区:同时打开多个加密库(单文件 .mdlb)/ 单个加密文件(.mdl);VSCode 式侧边栏(打开的文件、打开的库(有才显示)、收藏(有收藏才显示)、最近打开、工作目录;其中「打开的文件」与「最近打开」默认不显示,可在「设置 → 侧边栏分组」或侧边栏分组菜单开启);「打开的库」解锁后以递归文件夹树浏览内容,文件夹可展开/折叠,悬停可新建文件/文件夹/重命名/移动/删除;单文件 `.mdl` 不是库,打开时新开一个页签、内容区居中显示密码框,输入密码解锁后才解密显示;工作目录是操作系统目录视图,普通文件夹可展开,但目录里的库(.mdlb)是原子节点不展开,`.mdl` 显示为「加密文件」节点;**库锁定后,已打开的库内文件页签标题显示为「xx 库文件」(不暴露具体文件名),收藏/最近打开里的库内文件同样隐藏真实文件名**,重新解锁后恢复原名与内容;多文件切换支持顶部页签或左侧列表,可在设置中选择 - 外部修改监控:打开的文件被其它程序改写时及时重新加载(默认每 2s 比对一次磁盘 mtime/大小,并在窗口重新获得焦点时立刻检查):页签无未保存修改 → 直接换成磁盘上的新内容并提示;有未保存修改 → 不顶掉你的编辑,页签挂橙色角标,可在页签右键 / 点状态栏提示「重新加载」取磁盘版本(会先确认丢弃);文件在磁盘上被删除或移动时挂红色角标提醒,页签内容保留;可在「设置 → 通用 → 打开的文件 → 监控外部修改」关闭(.mdlb 库内文件按整个容器监控,只重读已打开的那几个文件) - 工作目录增减监控:侧边栏工作目录树按同样的轮询节奏(2s,并在窗口重新获得焦点/回到前台时立即检查)比对已挂载根目录与已列过内容的子目录的条目构成,别的程序往目录里新增/删除/重命名文件或文件夹时自动刷新(只看条目增减,不看文件内容;保留已展开的层级不被收起,刷新失败静默重试不弹窗),不受上面开关控制 - 收藏:可收藏库,也可收藏库内文件(库行、侧边栏条目的星标,或页签/库/收藏条目的右键菜单「收藏 / 取消收藏」);点击收藏的库内文件时,若库未解锁会先跳转解锁该库,解锁成功后自动加载并打开该文件 - 浏览:文件树、全文搜索(解密在内存中进行)、大纲、历史快照(可选,同样密文存储) - 安全:无操作自动锁定(默认 5 分钟)、锁屏/休眠锁定、锁定时密钥内存清零、剪贴板 60s 自动清除 - 其他:修改主密码、更换加密方案并全文重加密、明文导出(危险操作,二次确认) ## 加密设计 详见下方「Rust 加密核心」一节。 **库 = 单文件容器模型**:加密库(`.mdlb`)是一个**单文件**,文件头存 KDF 参数与「全库共享 DEK」的 wrapped_dek, 数据区是整棵文件树(文件名 + 目录结构 + 正文)的 JSON 序列化密文。磁盘上只有一个不透明 blob,连文件名、目录名都不可见。 单个 `.mdl` 文件也可独立存在(文件头自带 KDF 参数与 wrapped_dek,独立密码)。 ``` ┌─ 单文件库(.mdlb)───────────────────────┐ │ 头(明文 JSON) │ │ format : "mlk-vault/1" │ │ kdf : argon2id, m=64MB, t=3, p=4, salt │ │ wrapped_dek : KEK 包裹的全库 DEK │ │ 数据区(密文,AES-256-GCM) │ │ nonce + ct = JSON(文件树) │ │ ├─ 笔记/第一篇.md "正文..." │ │ ├─ 项目/方案.md "正文..." │ │ └─ ... │ └──────────────────────────────────────────┘ ``` - 算法:AES-256-GCM(认证加密,防篡改)+ Argon2id(抗 GPU 暴力破解) - 实现:Rust 侧 `aes-gcm` + `argon2` crate,前端只接触明文视图与密文字节,密钥不经过 JS - 解锁流程:主密码 + salt → Argon2id → KEK → 解开全库 DEK → 解密整棵文件树到内存;全程 < 300ms(个人笔记体量) - 写入:解锁后改任一文件,整棵树重新加密、整体重写 `.mdlb` 文件(个人笔记体量无感) - 改主密码:只重包裹全库 DEK,不重加密正文 - 单文件库(.mdlb)与单文件(.mdl)在磁盘上都用 `[4字节头长度 + 头JSON][nonce][ct]` 布局,靠 `format` 字段区分(`mlk-vault/1` vs `mlk/1`) ## 技术栈 | 层 | 选型 | 理由 | |---|---|---| | 壳 | Tauri 2 | 体积小(对比 Electron)、系统 WebView、Rust 原生能力做加密 | | 前端 | Vue 3 + Vite + TypeScript | Options API 组件,生态成熟 | | 组件库 | Ant Design Vue | 桌面工具型 UI 匹配度高,原型视觉已对齐其默认主题 | | 编辑器 | CodeMirror 6 | Markdown 语法高亮 + 源码模式 + 搜索/折叠/自动补全,已接入替换 textarea(见 `src/components/CodeMirrorEditor.vue`) | | 加密 | Rust:`aes-gcm` / `argon2` | 密钥操作全部在 Rust 侧完成 | > 📐 完整架构设计与功能演进时间线见 **[doc/ARCHITECTURE.md](doc/ARCHITECTURE.md)**。 ## 界面原型 `doc/ui-prototype/` 下是纯静态高保真原型(无外部依赖,双击即可看): ``` doc/ui-prototype/ ├── index.html # 原型导航 + 内嵌预览(入口) ├── assets/base.css # 共享基础样式(AntD 视觉基调) └── screens/ ├── unlock.html # 01 启动与解锁 ├── editor.html # 02 主编辑界面(VSCode 式工作区: # 打开的文件/打开的库/收藏/最近打开/工作目录; # 库锁定时所属页签变锁定占位,保留工作集; # 顶部页签或左侧列表两种切换方式,可设置) ├── settings.html # 03 设置(安全与加密为核心页) └── dialogs.html # 04 弹窗集合(新建库/解锁错误态/改主密码) ``` 浏览器打开 `doc/ui-prototype/index.html`,左侧切换四个界面。原型即后续 Vue 组件拆分的视觉基准。 ## 目录结构 ``` MarkLock/ ├── package.json # Vue/Vite/AntD/CodeMirror 依赖 + tauri 脚本 ├── vite.config.ts # Vite 配置(产物输出 dist,对齐 tauri frontendDist) ├── index.html # SPA 入口 ├── tsconfig.json ├── scripts/ # 图标生成脚本(gen-filetype-icons / gen-win-appicon) ├── src/ # Vue 3 前端工程(Options API,未用