Skip to content

Latest commit

 

History

35 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LynVault 2.4.1

抗取证加密保险柜 — 基于 Tauri + Rust 的桌面端加密文件管理系统。

将敏感文件加密存储于单个 .lyt 文件中,通过密码或密码+密钥文件双重认证解锁,支持多分区隔离、保险柜内安全删除、Office 内联预览与启动弹窗快速打开。2.4.1 起 .lyt 文件导航到软件可被自动识别(双击 / 拖放 / 运行中重复双击均直达密码输入),并提供单实例、索引内存缓存、批量操作等大量性能优化与修复。


核心功能

1. 加密保险柜

  • 加密算法:AES-256-GCM(认证加密,防篡改 + 防窃听)
  • 密钥派生:Argon2id (m_cost=65536, t_cost=3, p_cost=1) → HKDF-SHA512 扩展,派生三把独立密钥:
    • enc_key — 加解密文件数据
    • auth_key — 认证标签验证(防暴力破解)
    • sign_key — 头部签名(HMAC-SHA512,防头部篡改)
  • 上下文绑定(AAD):每个密文块绑定其虚拟路径(vpath),防止密文移动攻击
  • 认证方式
    • 纯密码模式
    • 密码 + 密钥文件双重认证(密钥文件可存储在 USB 等物理介质)
  • 头部结构:1024 字节固定头部,包含 magic bytes、版本号、salt、nonce counter、分区表、认证标签和签名,所有字段均校验完整性
  • 文件后缀:默认使用 .lyt

2. 伪装分区(Plausible Deniability)

  • 单个保险柜最多支持 8 个独立分区,每个分区拥有独立的密码和密钥
  • 用不同密码打开保险柜会进入不同分区,分区之间完全隔离
  • 未使用的分区条目整体填充随机数据,与真实分区在结构上不可区分;打开时恒定遍历全部 8 个条目(恒定时间)
  • 支持动态添加/删除分区;删除分区时按 DoD 7-pass 擦除其索引区
  • 已知限制:分区别名以明文存储于头部(分区管理功能需要),真实分区数量可通过解析头部推断;删除分区时该分区的文件密文因无分区密码无法定位,无法一并擦除(详见「已知限制」)

3. 文件浏览与管理

  • 虚拟文件系统:所有文件存储在加密保险柜内部,通过虚拟路径 (vpath) 访问
  • 文件夹导航:树状目录结构,支持路径输入框直接跳转 + 上级目录返回
  • 导入文件:选择本地文件导入到当前目录,支持多选批量导入
  • 导入文件夹:递归导入整个文件夹,保留目录结构;跳过符号链接,限制目录层级与项目数量
  • 提取选中:将选中的文件/文件夹解密导出到本地指定目录;遇到已有同名文件时弹窗确认,确认后覆盖(2.4.1 起与确认语义一致)
  • 提取全部:一键提取保险柜内所有文件到指定父目录,自动创建以保险柜文件名命名的根文件夹,保留内部目录结构。单次索引加载 O(n) 性能优化
  • 批量操作:支持 Ctrl+多选,批量提取、批量删除(文件夹自动展开为内部所有文件,嵌套选中自动去重)
  • 新建文件夹:在当前目录下创建子文件夹
  • 重命名:文件/文件夹重命名(右键菜单或选中后操作)
  • 删除:从保险柜中安全删除选中的文件/文件夹
  • 右键菜单:文件/文件夹右键弹出快捷操作菜单

4. 安全查看(零明文泄露)

无需导出即可在应用内预览文件内容,文件始终不解密到磁盘

  • 图片预览:支持 PNG / JPG / GIF / BMP / WebP / TIFF,内置鼠标滚轮缩放
  • 文本查看:支持 TXT / MD / JSON / CSV / XML / INI / YAML 等纯文本格式,以及常见代码文件(.rs / .js / .go / .py / .sh 等)
  • Office 预览
    • .docx — 解压 ZIP 解析 word/document.xml 提取文本
    • .xlsx/.xls — 通过 calamine 读取所有工作表
    • .pptx — 解析幻灯片 XML
    • .doc — OLE 复合文档 UTF-16LE 文本流扫描
    • .csv — 直接 UTF-8 渲染
  • 不支持的格式会提示导出后查看

5. 保险柜内安全删除

  • 删除保险柜内的文件或文件夹时,先持久化更新加密索引,再对对应密文区域执行 DoD 5220.22-M 7-pass 覆写
  • 写入失败时,索引已不再引用该密文,避免出现已擦除但仍被索引指向的数据损坏
  • 为避免 WebView IPC 被滥用,应用不会自动擦除导入来源的本地文件;导入完成后请自行确认并处理源文件

6. 保险柜销毁

  • 二次确认后执行不可逆销毁
  • 先关闭保险柜,再对整个 .lyt 文件执行 DoD 5220.22-M 7-pass 擦除
  • 擦除完成后删除文件

7. 碎片整理

  • 对保险柜文件执行碎片整理,压缩冗余空间
  • 单分区走紧凑整理:重建只含有效数据的文件布局,物理文件长度直接缩小,真正回收磁盘空间(2.4.1)
  • 多分区走保守整理:仅重写活跃分区,其他分区数据原样保留,旧数据区 DoD 7-pass 逻辑擦除
  • 整理过程使用临时文件 + 原子替换,崩溃时可自动回滚(含分区偏移回滚)
  • 整理后自动重新加载文件列表

8. 内部操作记录

  • 保险柜在内部维护关键操作记录,用于文件格式兼容与错误追踪
  • 当前界面不提供审计日志查看入口

9. .lyt 文件自动识别(2.4.1 新功能)

.lyt 文件以任何方式导航到软件,都会被自动识别并直接进入该保险柜的密码输入流程,而不是被误当作待加密文件导入:

  • 双击打开(文件关联):程序首次运行时自动注册用户级文件关联(HKCU,无需管理员,便携版同样生效;用户已将 .lyt 关联到其他程序时不覆盖)。资源管理器双击 .lyt → 系统以 LynVault.exe <文件路径> 启动 → 跳过启动弹窗直接进入密码输入
  • 运行中重复双击(单实例转发):程序已在运行时再次双击 .lyt,第二个进程通过本机 TCP 单实例端口把路径转发给已运行实例后立即退出(不闪窗口);已运行实例自动聚焦窗口并向前端发出 vault-file-requested 事件打开密码输入
  • 拖放识别:把 .lyt 拖入窗口 → 自动检测(扩展名 + magic bytes 双重校验)→ 弹出密码输入;普通文件拖放行为不变(正常导入)
  • 识别防护:仅头部 8 字节为 PYVAULT4 的真正 LynVault 文件才会被识别,其他工具(HashiCorp Vault 等)的同后缀文件不会被误判
  • 密码错误可原地重试,取消则回到启动弹窗;启动弹窗后台静默预扫描,取消后列表已就绪

10. 启动检测与快速打开

应用启动时会自动扫描常见目录(桌面、文档、下载、用户主目录)下的 .lyt / .vault 文件,弹出不可关闭的快速打开对话框:

  • 列出所有检测到的保险柜文件(按修改时间倒序,显示名称、时间、大小)
  • Magic bytes 校验:仅显示头部 8 字节为 PYVAULT4 的真正 LynVault 文件,过滤掉其他工具(如 HashiCorp Vault、1Password)的同后缀文件,避免误识别和元数据泄露
  • 点击任一项直接进入密码输入流程,密码错误时内联提示不销毁密码框,支持原地重试
  • 提供「新建保险柜」和「打开其他保险柜」按钮,取消任何步骤都会回到启动弹窗(不卡死)
  • 弹窗显示期间,主窗口工具栏/文件列表灰显且不可操作(强制用户先选择打开/新建)
  • 启动扫描期间禁用「新建/打开」按钮,防止用户在弹窗弹出前操作
  • 列表项点击防重入,防止快速双击弹出多个密码框

11. 内存安全

  • 所有密钥材料使用 zeroize crate 自动清零(ZeroizeOnDrop
  • 加解密中间变量(plaintext、master key、derived key)使用后立即 zeroize()
  • 保险柜全局状态使用 Mutex 保护,panic 时自动 catch 防止闪退

项目结构

LynVault 2.4.1/
├── Cargo.toml                 # Workspace 根配置
├── Cargo.lock
├── src-tauri/                 # Tauri 桌面应用
│   ├── Cargo.toml
│   ├── tauri.conf.json        # Tauri 配置(窗口、权限、打包)
│   ├── build.rs
│   ├── icons/                 # 应用图标
│   └── src/
│       ├── main.rs            # 入口 + 命令注册 + .lyt 启动参数解析
│       ├── commands.rs        # Tauri IPC 命令(2.4.1:重 I/O 命令 async 化)
│       ├── single_instance.rs # 2.4.1:单实例 + 参数转发 + vault-file-requested 事件
│       └── file_assoc.rs      # 2.4.1:.lyt 文件关联自注册(Windows HKCU)
├── crates/
│   └── vault-core/            # 核心加密库(纯 Rust,无平台依赖)
│       ├── Cargo.toml
│       ├── src/
│       │   ├── lib.rs         # 模块导出
│       │   ├── vault.rs       # 保险柜生命周期管理(2.4.1:索引缓存 / 批量操作 / 紧凑碎片整理)
│       │   ├── crypto.rs      # AES-256-GCM / Argon2id / HKDF / HMAC
│       │   ├── index.rs       # 加密文件索引
│       │   ├── lock.rs        # 并发锁 + 签名验证
│       │   ├── audit.rs       # 操作审计日志
│       │   ├── wipe.rs        # DoD 安全擦除
│       │   ├── office.rs      # Office 文档文本提取
│       │   └── error.rs       # 错误类型定义
│       └── tests/
│           └── vault_integration.rs  # 2.4.1:12 项集成测试
└── ui/                        # 前端界面(vanilla JS)
    ├── index.html             # 主界面
    ├── styles.css             # 样式(含启动弹窗主题)
    └── app.js                 # 交互逻辑(2.4.1:.lyt 识别 + base64 预览 + 批量导入)

Tauri IPC 命令

命令 说明
create_vault 创建新保险柜(加密 + 自动打开)
open_vault 打开并认证保险柜
close_vault 关闭当前保险柜
list_folder 列出目录内容
import_file 导入单个文件
import_files_batch 批量导入(单次索引加密落盘,返回 {ok, fail},失败项不中断整体)
import_folder 递归导入文件夹
import_dropped_paths 拖放导入(自动判断文件/文件夹)
extract_file 提取单个文件
extract_files 批量提取文件
extract_all_files 提取全部文件到指定父目录(自动创建保险柜同名子文件夹,单次索引加载 O(n))
check_extract_all_dest 预检目标子文件夹是否已存在
delete_files 批量安全删除文件/文件夹(展开文件夹 + 去重 + DoD 7-pass,先存索引再擦密文防损坏)
delete_folder 删除文件夹
new_folder 新建文件夹
rename_item 重命名文件/文件夹
add_partition 添加伪装分区
remove_partition 删除伪装分区
list_partitions 列出所有分区
defragment_vault 碎片整理
destroy_vault 不可逆销毁保险柜
get_file_info 获取文件元信息
load_file_content 安全加载文件内容
preview_office_file Office 文档预览
scan_vault_files 扫描目录下的 .lyt 文件(启动弹窗用)
check_vault_file 校验路径是否为 LynVault 保险柜(扩展名 + magic bytes,拖放识别用)
get_launch_vault_arg 读取启动参数中的保险柜路径(双击 .lyt 启动直达密码输入;读取即清除)
frontend_ready 前端就绪通知(单实例转发的打开请求等前端注册监听器后再发事件)
get_file_icon 按扩展名读取系统文件图标(Windows,阻塞线程池执行)

技术栈

技术
前端 HTML + CSS + JavaScript (vanilla)
框架 Tauri 1.x
后端 Rust 2021 Edition
加密 aes-gcm (AES-256-GCM) / argon2 (Argon2id, 64MB/3 iter) / hkdf / hmac / sha2
内存安全 zeroize (ZeroizeOnDrop)
Office 解析 calamine (Excel) / quick-xml (DOCX/PPTX) / zip
打包 Tauri bundler (Windows .exe / .msi)

安全架构

LynVault 采用纵深防御设计,兼顾机密性完整性抗取证能力

密钥层次

主密码 + 密钥文件(可选)
        │
        ▼
  Argon2id (64 MB / 3 iter)        ← 内存硬函数,抵抗 GPU/ASIC 暴力破解
        │
        ▼
    32 字节 master key
        │
        ▼
  HKDF-SHA512 扩展(带长度前缀,域分离)
        │
        ├─► enc_key (32B) — AES-256-GCM 加解密,绑定 AAD
        ├─► auth_key (32B) — GCM 认证标签验证
        └─► sign_key (32B) — HMAC-SHA512 头部签名

攻击面防御

威胁 防御措施
暴力破解密码 Argon2id 内存硬性 + 认证标签验证 + Tauri 端全局冷却 + 持久化防暴力锁定(2.3.0 起真正生效:5 次错误锁定 30 分钟,跨重启有效)
密文篡改 AES-256-GCM 认证加密(主防线)+ 头部签名(多分区时为尽力而为校验,见下)
密文移动攻击 AAD 将每个密文块绑定到虚拟路径,无法在不同 vpath 间移动
分区交换攻击 每个分区独立密钥,AAD 常量 b"index" 锁定索引数据
明文残留 保险柜内删除先更新加密索引再 DoD 7-pass 覆写密文;导入来源由用户在应用外自行处理
内存泄露 zeroize 自动清零密钥材料,错误路径同样清零
路径遍历 canonicalize 验证提取目标路径,拒绝跳出基目录的符号链接;已有同名文件默认拒绝覆盖
计时侧信道 打开时恒定遍历全部 8 个分区条目(无论真实分区数量),抹平响应时间差异
密钥派生歧义 密码 + 密钥文件拼接使用长度前缀,防止不同输入派生相同密钥
符号链接与递归导入 导入文件夹跳过符号链接并限制目录深度和项目数量;提取校验规范化输出目录
锁定机制绕过 锁定区 HMAC 使用从 salt 独立派生的公开密钥:任何密码的尝试都能校验并递增计数(锁定真正生效);局限:拥有文件写权限者可伪造「未锁定」记录,见「已知限制」
系统时钟回拨 锁定状态额外使用单调时钟,防止进程内系统时间回拨绕过(跨重启回拨仍需系统时钟,见「已知限制」)
头部篡改 单分区保险柜严格要求签名匹配;多分区时头部可能由其他分区(不同密码)签名,签名不匹配不再误报篡改 —— 篡改仍会被分区认证失败 / GCM 认证失败捕获
删除时数据损坏 所有删除路径统一「先 save_index 标记删除,再覆写密文」,覆写失败时密文残留无害(索引已不指向)
恶意文件崩溃 索引长度上限 + checked_add 防溢出;Office 预览解压尺寸上限(防 zip 炸弹);导入/加载文件大小上限(防 OOM)
启动扫描误识别 校验文件头部 magic bytes PYVAULT4,过滤其他工具的同后缀文件
启动扫描元数据泄露 仅返回通过 magic 校验的文件,非 LynVault 文件不暴露其存在性
覆盖误删 提取全部前预检目标子文件夹,已存在时弹窗确认

已知限制

  • 在 ZFS/Btrfs/APFS 等写时复制文件系统上,DoD 7-pass 擦除可能写入多个物理副本而非覆写同一物理块。这是文件系统层面的固有限制,建议在 ext4/NTFS 上使用以获得最佳擦除效果。
  • 内存硬性 KDF 在低内存设备上可能耗时较长(每次认证约 0.1s);打开时恒定执行 8 次 Argon2id(分区数上限),单分区保险柜打开约需 1s 左右,这是恒定时间与分区计数隐藏的必要代价。
  • 防暴力锁定针对「在线猜测 / 误输密码」场景:拥有文件写权限的攻击者可伪造「未锁定」记录(与其直接破坏文件同级);离线复制文件暴力破解不受锁定影响(所有密码库皆然)。
  • 跨重启后锁定状态依赖系统时钟(单调时钟不持久化),回拨系统时钟可提前解除锁定,需要文件写权限,与伪造锁定区同级。
  • 分区别名以明文存储于头部(分区管理功能需要),真实分区数量可通过解析头部推断;未使用条目填充随机数据使其与真实条目结构不可区分。
  • 删除伪装分区时仅能擦除其索引区:该分区的文件密文因无分区密码无法定位,无法一并擦除;保险柜整体销毁时会一并擦除。
  • 单文件导入/安全加载上限 256 MiB(内存加密/解密的固有限制);Office 预览文本上限 64 MiB,超出请提取后查看。
  • 碎片整理:单分区走紧凑整理(物理文件直接缩小);多分区采用「保守整理」—— 仅重写活跃分区、不截断文件(其他分区数据位置未知),旧数据区以 DoD 7-pass 逻辑擦除。

编译(Windows)

# 安装 Tauri CLI
cargo install tauri-cli

# 直接构建可执行文件
cargo build --release

# 或构建发布版安装包(NSIS/MSI)
cargo tauri build

系统要求

  • Windows 10 1803+(本应用仅面向 Windows 发布)
  • Rust 工具链 (rustup) + MSVC Build Tools
  • WebView2 Runtime(Win 10 1803+ 通常已预装)
  • 构建产物:target/release/LynVault.exe(workspace 根目录 target)

更新日志

2.4.1

新功能:.lyt 文件自动识别(本版本主题)

  • 新增.lyt 文件以任何方式导航到软件都会被自动识别并直达密码输入:① 资源管理器双击(程序首启自注册用户级文件关联,HKCU 免管理员,便携版同样生效;已关联到其他程序时不覆盖);② 程序运行中重复双击(本机 TCP 单实例端口转发路径,第二进程无窗口闪退,已运行实例聚焦并弹出密码框);③ 拖入窗口(扩展名 + magic bytes PYVAULT4 双重校验,不误判 HashiCorp Vault 等同后缀文件,普通文件拖放导入行为不变)
  • 新增:单实例运行 —— 二次启动自动转发参数后退出,杜绝多实例并发操作同一保险柜
  • 新增:创建保险柜后免二次认证(create 成功直接进入已解锁会话)
  • 新增:批量导入命令 import_files_batch(单次索引加密落盘,多选导入不再逐文件写盘);拖放误入的保险柜文件由后端自动分流为「打开」而非「导入」

性能优化

  • 优化:索引内存缓存 —— 旧实现每次操作都「读磁盘 → AES-GCM 解密 → JSON 反序列化」,千文件目录下导航明显卡顿;现首次加载后常驻缓存,save_index 成功后同步刷新,close 时清理
  • 优化:重 I/O 的 Tauri 命令全部 spawn_blocking 异步化(打开/导入/提取/删除/碎片整理/扫描等),大文件操作不再冻结 UI 主线程
  • 优化:安全查看 IPC 由 JSON 字节数组改为 base64 —— 旧版预览 5 MB 图片实际要在 IPC 上传输几十 MB 文本,现降至 1.33× 膨胀且前端直接拼 data URL
  • 优化:DoD 擦除的 Random pass 由逐块 OsRng 改为 ChaCha20 流式生成,大文件擦除显著提速
  • 优化:碎片整理(单分区)改为紧凑整理 —— 新临时文件只含「头部 + 迁移数据 + 新索引」,旧数据区不进入新文件,物理文件长度直接缩小(旧版仅逻辑擦除、文件体积反而膨胀);多分区保持保守整理
  • 优化:并行 Argon2id 密钥派生(rayon),密钥文件模式打开提速
  • 优化:批量提取 / 批量删除 / 提取全部统一单次 load_index + 摘要审计(原逐文件审计日志膨胀)

修复

  • 修复:密码强度按字符数而非字节数校验(旧实现 4 个 12+ 字符汉字构成的短密码可通过,11 个 ASCII 字符反而被拒)
  • 修复:文件名清理由「白名单」改为「黑名单」—— 旧白名单会把 report#1.txt 静默改名为 report1.txt,批量提取时引发大量「目标已存在」失败;现保留 Unicode 与常见符号,仅剔除路径危险字符
  • 修复:Windows 保留设备名检查只比对完整文件名 → CON.txt 不加前缀,提取到 Windows 必然创建失败;现按主名(去扩展名)匹配后加 _ 前缀
  • 修复:提取确认「覆盖」后仍用 create_new 拒绝覆盖 → 与确认文案矛盾导致大批失败;现按确认语义执行覆盖
  • 修复:碎片整理失败恢复时分区偏移未回滚 —— 闭包内已更新为新偏移而恢复的原文件仍是旧布局,后续读写错位
  • 修复:碎片整理旧数据区擦除会毁掉多分区场景下的有效数据风险(补防御性布局校验)
  • 修复:密钥派生缓冲区未预留容量,realloc 在堆上遗留含密码的旧副本 → 精确预留 + 用后清零
  • 修复tauri.conf.json 使用了 Tauri 2.0 才有的 bundle.fileAssociations / allowlist event 字段(tauri-build 1.x 直接拒绝构建)
  • 修复:vpath 反斜杠 / 控制字符校验归一化,.. 遍历段被中和到根内路径
  • 修复:图标集不完整(仅 icon.ico,PNG/ICNS 缺失导致构建失败)→ 补齐 32/128/256 PNG 与 ICNS
  • 修复DOMContentLoaded 回调未声明 async 而内部使用 await —— 整个 app.js 解析失败,表现为按钮全部无响应、启动扫描不运行

测试

  • 新增:vault-core 集成测试 12 项(创建即解锁 / magic 识别 / 批量导入持久化 / 批量删除 / 索引缓存一致性 / Unicode 文件名 / 保留设备名 / 密码字符数 / 紧凑碎片整理 / 提取全部 / 分区密码隔离 / 错误密码拒绝),全部通过

2.4.0

关键修复(锁定机制 / 伪装分区)

  • 修复:防暴力破解锁定完全失效 → 旧实现锁定区 HMAC 用「密码派生密钥」签名,任何错误密码都过不了校验、lock_count 永不递增,5 次错误锁定 30 分钟形同虚设。现改为从 salt 独立派生的公开密钥:任意密码的尝试都能校验并递增计数,锁定真正生效(跨重启有效),错误密码也返回正确的 AuthFailed 而非误导性的「头部被篡改」
  • 修复:伪装(诱饵)分区无法打开 → 旧实现锁定区只认主密码 + 头部签名只认主分区密钥,诱饵密码必然被拒。现锁定区与密码解耦,多分区时头部签名不匹配不再误报篡改(打开后自动用当前分区密钥重新签名)
  • 修复:打开旧版(<2.3.0)保险柜时自动识别旧格式锁定区并迁移(旧版多分区保险柜需先用主密码打开一次完成迁移后,诱饵密码方可打开)

崩溃 / DoS 防护

  • 修复:恶意保险柜头部可经 index_offset + index_length 整数溢出绕过边界检查并触发超大内存分配(进程被杀)→ 改用 checked_add + 索引长度上限
  • 修复:Office 预览压缩炸弹(docx/xlsx/pptx 解压巨量数据导致 OOM)→ 每个 ZIP 条目、幻灯片数量、总文本量统一限制 64 MiB
  • 修复:导入文件无大小上限、整文件读入内存导致 OOM → 导入/加载统一 256 MiB 上限
  • 修复:碎片整理将每个文件密文整体读入内存(超大文件 OOM)→ 改为固定 1 MiB 缓冲流式拷贝
  • 修复:Mutex 中毒后应用永久「内部错误」→ 增加中毒恢复,panic 不再让全局状态失效

数据完整性 / 抗取证

  • 修复secure_delete_file / delete_folder 仍是「先擦密文后存索引」→ 统一为「先 save_index 再擦密文」,与批量删除一致,杜绝崩溃窗口内的数据损坏
  • 修复remove_partition 先擦后更新头部 → 改为先持久化再擦除
  • 修复:碎片整理在磁盘上遗留完整保险柜副本 .vault.bak(销毁时残留)→ 整理成功后备份 DoD 7-pass 擦除;destroy_vault 一并清理残留备份
  • 修复:Windows 上无法对目录句柄 fsync(File::open(目录) 必失败)→ 使用 FILE_FLAG_BACKUP_SEMANTICS 正确同步父目录
  • 修复:提取文件名结尾 ./空格 在 Windows 上被规范化导致静默互相覆盖 → 提取前剔除结尾点/空格,并对 CON/NUL/COM1.. 等保留设备名加前缀

信息泄露 / 侧信道

  • 修复:分区数量泄露(未使用条目以「别名首字节 0」标记,可被数出真实分区数)→ 未使用条目整体随机填充;打开时恒定遍历全部 8 个条目(恒定时间,与真实分区数无关)
  • 修复derive_lock_key 的密码+密钥文件裸拼接歧义(与 derive_keys 长度前缀不一致)→ 新锁定密钥不再涉及密码拼接,歧义仅在旧格式兼容路径保留
  • 修复:密码/密钥文件在错误返回路径上未 zeroize() → 所有路径统一清零

性能 / 健壮性

  • 修复extract_files 命令对每个文件重复 load_index(O(n²))→ 新增 extract_files_batch 单次加载
  • 修复list_folder 对带结尾 / 的路径返回空列表 → 后端归一化目录参数
  • 修复:库级 add_partition 不校验分区别名(仅命令层校验)→ vault-core 层同步校验
  • 修复:32 位平台 dod_overwrite_range 的 u64→usize 截断 → 显式拒绝超地址空间区间
  • 修复tauri.conf.jsonfileDropEnabled 误放在 allowlist.window(tauri-build 1.5.6 schema 校验拒绝,构建失败)→ 移入 windows[] 窗口配置
  • 修复src-tauri/Cargo.toml 缺少与 allowlist.window 对应的 window-center / window-set-resizable / window-set-size / window-set-title features(tauri-build 功能一致性检查拒绝)→ 补齐
  • 修复get_file_icon 的 Windows 图标代码与 windows 0.57 API 不匹配(HICON 实际位于 Win32::UI::WindowsAndMessagingSHFILEINFOW.hIcon 非 Option、SHGetFileInfoW 需要 Win32_Storage_FileSystem feature、RAII guard 引用了函数作用域内的导入)→ 修正导入路径、feature 与 hIcon 判断逻辑
  • 变更:workspace 启用 resolver = "2"
  • 新增:右键菜单增强 —— 查看/提取/删除/重命名保持,提取与删除支持多选(右键已选中项作用于整组);文件列表空白区右键可新建文件夹、导入文件、导入文件夹;对应工具栏按钮(安全查看/提取选中/安全删除/新建文件夹)移除,工具栏精简
  • 修复:WebView2 原生右键菜单(刷新/返回/检查元素等)总是覆盖自定义菜单 → vendor 一份 wry 0.24.12 源码(vendor/wry,经 [patch.crates-io] 引入)将 SetAreDefaultContextMenusEnabled 改为 false
  • 改进:窗口尺寸由正方形改为横屏 3:2 比例(宽度 ≤ 屏幕 80% / 上限 1280,高度 ≤ 屏幕 85%),默认配置 1100×700,避免窗口过高过长
  • 新增get_file_icon 改为异步命令 + spawn_blocking,Shell/GDI 图标查询在阻塞线程池执行,不占用主线程,大量文件渲染时界面不再卡死(查询使用 SHGFI_USEFILEATTRIBUTES + 伪文件名,不访问磁盘/网络)
  • 修复:Windows 文件图标读取不到(全部回退 emoji)→ 根因是 GetDIBits 尺寸查询时 biBitCount 被设为 32,返回 0 + ERROR_INVALID_PARAMETER(87);按 MSDN 要求改为 0,实测所有扩展名均可正常输出 16×16 PNG 图标
  • 新增:全选功能 —— Ctrl+A 快捷键全选当前目录(输入框内保持原生文本全选);文件列表空白区右键菜单新增「全选」项
  • 变更:构建产物文件名由 lynvault-rs.exe 改为 LynVault.exesrc-tauri/Cargo.toml 增加 [[bin]] name = "LynVault"
  • 改进:窗口尺寸进一步按比例缩小(宽度 ≤ 屏幕 60% / 上限 1024,高度 ≤ 屏幕 80%,3:2 比例),默认配置 960×620

About

抗取证加密保险柜 — 基于 Tauri + Rust 的桌面端加密文件管理系统。 将敏感文件加密存储于单个.lyt文件中(兼容旧版本.vault),通过密码或密码+密钥文件双重认证解锁,支持多分区隔离、安全分区、Office内联预览、启动弹窗快速打开,以及完整的操作审计日志。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages