抗取证加密保险柜 — 基于 Tauri + Rust 的桌面端加密文件管理系统。
将敏感文件加密存储于单个 .lyt 文件中,通过密码或密码+密钥文件双重认证解锁,支持多分区隔离、保险柜内安全删除、Office 内联预览与启动弹窗快速打开。2.4.1 起 .lyt 文件导航到软件可被自动识别(双击 / 拖放 / 运行中重复双击均直达密码输入),并提供单实例、索引内存缓存、批量操作等大量性能优化与修复。
- 加密算法: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
- 单个保险柜最多支持 8 个独立分区,每个分区拥有独立的密码和密钥
- 用不同密码打开保险柜会进入不同分区,分区之间完全隔离
- 未使用的分区条目整体填充随机数据,与真实分区在结构上不可区分;打开时恒定遍历全部 8 个条目(恒定时间)
- 支持动态添加/删除分区;删除分区时按 DoD 7-pass 擦除其索引区
- 已知限制:分区别名以明文存储于头部(分区管理功能需要),真实分区数量可通过解析头部推断;删除分区时该分区的文件密文因无分区密码无法定位,无法一并擦除(详见「已知限制」)
- 虚拟文件系统:所有文件存储在加密保险柜内部,通过虚拟路径 (
vpath) 访问 - 文件夹导航:树状目录结构,支持路径输入框直接跳转 + 上级目录返回
- 导入文件:选择本地文件导入到当前目录,支持多选批量导入
- 导入文件夹:递归导入整个文件夹,保留目录结构;跳过符号链接,限制目录层级与项目数量
- 提取选中:将选中的文件/文件夹解密导出到本地指定目录;遇到已有同名文件时弹窗确认,确认后覆盖(2.4.1 起与确认语义一致)
- 提取全部:一键提取保险柜内所有文件到指定父目录,自动创建以保险柜文件名命名的根文件夹,保留内部目录结构。单次索引加载 O(n) 性能优化
- 批量操作:支持 Ctrl+多选,批量提取、批量删除(文件夹自动展开为内部所有文件,嵌套选中自动去重)
- 新建文件夹:在当前目录下创建子文件夹
- 重命名:文件/文件夹重命名(右键菜单或选中后操作)
- 删除:从保险柜中安全删除选中的文件/文件夹
- 右键菜单:文件/文件夹右键弹出快捷操作菜单
无需导出即可在应用内预览文件内容,文件始终不解密到磁盘:
- 图片预览:支持 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 渲染
- 不支持的格式会提示导出后查看
- 删除保险柜内的文件或文件夹时,先持久化更新加密索引,再对对应密文区域执行 DoD 5220.22-M 7-pass 覆写
- 写入失败时,索引已不再引用该密文,避免出现已擦除但仍被索引指向的数据损坏
- 为避免 WebView IPC 被滥用,应用不会自动擦除导入来源的本地文件;导入完成后请自行确认并处理源文件
- 二次确认后执行不可逆销毁
- 先关闭保险柜,再对整个
.lyt文件执行 DoD 5220.22-M 7-pass 擦除 - 擦除完成后删除文件
- 对保险柜文件执行碎片整理,压缩冗余空间
- 单分区走紧凑整理:重建只含有效数据的文件布局,物理文件长度直接缩小,真正回收磁盘空间(2.4.1)
- 多分区走保守整理:仅重写活跃分区,其他分区数据原样保留,旧数据区 DoD 7-pass 逻辑擦除
- 整理过程使用临时文件 + 原子替换,崩溃时可自动回滚(含分区偏移回滚)
- 整理后自动重新加载文件列表
- 保险柜在内部维护关键操作记录,用于文件格式兼容与错误追踪
- 当前界面不提供审计日志查看入口
.lyt 文件以任何方式导航到软件,都会被自动识别并直接进入该保险柜的密码输入流程,而不是被误当作待加密文件导入:
- 双击打开(文件关联):程序首次运行时自动注册用户级文件关联(HKCU,无需管理员,便携版同样生效;用户已将
.lyt关联到其他程序时不覆盖)。资源管理器双击.lyt→ 系统以LynVault.exe <文件路径>启动 → 跳过启动弹窗直接进入密码输入 - 运行中重复双击(单实例转发):程序已在运行时再次双击
.lyt,第二个进程通过本机 TCP 单实例端口把路径转发给已运行实例后立即退出(不闪窗口);已运行实例自动聚焦窗口并向前端发出vault-file-requested事件打开密码输入 - 拖放识别:把
.lyt拖入窗口 → 自动检测(扩展名 + magic bytes 双重校验)→ 弹出密码输入;普通文件拖放行为不变(正常导入) - 识别防护:仅头部 8 字节为
PYVAULT4的真正 LynVault 文件才会被识别,其他工具(HashiCorp Vault 等)的同后缀文件不会被误判 - 密码错误可原地重试,取消则回到启动弹窗;启动弹窗后台静默预扫描,取消后列表已就绪
应用启动时会自动扫描常见目录(桌面、文档、下载、用户主目录)下的 .lyt / .vault 文件,弹出不可关闭的快速打开对话框:
- 列出所有检测到的保险柜文件(按修改时间倒序,显示名称、时间、大小)
- Magic bytes 校验:仅显示头部 8 字节为
PYVAULT4的真正 LynVault 文件,过滤掉其他工具(如 HashiCorp Vault、1Password)的同后缀文件,避免误识别和元数据泄露 - 点击任一项直接进入密码输入流程,密码错误时内联提示不销毁密码框,支持原地重试
- 提供「新建保险柜」和「打开其他保险柜」按钮,取消任何步骤都会回到启动弹窗(不卡死)
- 弹窗显示期间,主窗口工具栏/文件列表灰显且不可操作(强制用户先选择打开/新建)
- 启动扫描期间禁用「新建/打开」按钮,防止用户在弹窗弹出前操作
- 列表项点击防重入,防止快速双击弹出多个密码框
- 所有密钥材料使用
zeroizecrate 自动清零(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 预览 + 批量导入)
| 命令 | 说明 |
|---|---|
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 逻辑擦除。
# 安装 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)
新功能:.lyt 文件自动识别(本版本主题)
- 新增:
.lyt文件以任何方式导航到软件都会被自动识别并直达密码输入:① 资源管理器双击(程序首启自注册用户级文件关联,HKCU 免管理员,便携版同样生效;已关联到其他程序时不覆盖);② 程序运行中重复双击(本机 TCP 单实例端口转发路径,第二进程无窗口闪退,已运行实例聚焦并弹出密码框);③ 拖入窗口(扩展名 + magic bytesPYVAULT4双重校验,不误判 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/ allowlistevent字段(tauri-build 1.x 直接拒绝构建) - 修复:vpath 反斜杠 / 控制字符校验归一化,
..遍历段被中和到根内路径 - 修复:图标集不完整(仅 icon.ico,PNG/ICNS 缺失导致构建失败)→ 补齐 32/128/256 PNG 与 ICNS
- 修复:
DOMContentLoaded回调未声明async而内部使用await—— 整个 app.js 解析失败,表现为按钮全部无响应、启动扫描不运行
测试
- 新增:vault-core 集成测试 12 项(创建即解锁 / magic 识别 / 批量导入持久化 / 批量删除 / 索引缓存一致性 / Unicode 文件名 / 保留设备名 / 密码字符数 / 紧凑碎片整理 / 提取全部 / 分区密码隔离 / 错误密码拒绝),全部通过
关键修复(锁定机制 / 伪装分区)
- 修复:防暴力破解锁定完全失效 → 旧实现锁定区 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.json中fileDropEnabled误放在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-titlefeatures(tauri-build 功能一致性检查拒绝)→ 补齐 - 修复:
get_file_icon的 Windows 图标代码与windows 0.57API 不匹配(HICON实际位于Win32::UI::WindowsAndMessaging、SHFILEINFOW.hIcon非 Option、SHGetFileInfoW需要Win32_Storage_FileSystemfeature、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.exe(src-tauri/Cargo.toml增加[[bin]] name = "LynVault") - 改进:窗口尺寸进一步按比例缩小(宽度 ≤ 屏幕 60% / 上限 1024,高度 ≤ 屏幕 80%,3:2 比例),默认配置 960×620