PassBox 开发文档

概述

PassBox 是一款密码管理器,帮助您安全地存储、组织和检索密码及敏感信息。凭借直观的界面和强大的安全功能,PassBox 让您轻松为所有在线账户维护强大且独特的密码,无需记忆所有密码的烦恼。 应用程序以安全为核心设计,采用行业标准加密算法保护您的数据。与将数据存储在远程服务器的云端密码管理器不同,PassBox 将您的加密数据保存在本地设备上,让您完全掌控敏感信息。

主要功能

技术栈

PassBox 采用现代技术栈构建,确保性能、安全和跨平台兼容性:

前端

前端使用 Vue.js 3、TypeScript 和 Vite 构建,提供响应式且直观的用户界面:

后端

后端采用 Rust 和 Tauri 构建,提供高性能和安全性:

应用架构设计

应用架构

  flowchart TD
    A[前端 - Vue.js] <--> B[Tauri 桥接]
    B <--> C[后端 - Rust]
    C --> D[SQLite 数据库]
    C --> E[加密模块]
    C --> F[云同步模块]
    D <--> E

前端通过 Tauri 的命令系统与后端通信,为基于 Web 的 UI 和原生 Rust 代码提供安全桥接。所有敏感操作(如加密和数据库访问)均由 Rust 后端处理,确保安全性和性能。

前后端交互

在现代桌面应用开发中,将强大的前端框架与安全轻量的后端相结合至关重要。 Tauri 和 Vue.js 能成为桌面应用开发的强大组合,是因为它们能够互补彼此的优势。Vue.js 提供了响应式的组件化前端框架,非常适合构建用户界面;而 Tauri 则提供了用 Rust 构建的安全轻量后端,负责处理系统级操作和数据处理。这创造了清晰的职责分离——前端处理 UI 逻辑,后端管理数据操作、加密和系统交互。

  sequenceDiagram
    participant V as Vue 组件
    participant I as Invoke.vue
    participant T as Tauri 后端
    participant D as 数据库

    V->>I: invoke_rs(command, params)
    I->>T: invoke(command, params)
    T->>D: 处理请求
    D-->>T: 返回数据
    T-->>I: ResponseData<T>
    I-->>V: ResponseData<T>

这种架构确保所有敏感操作(如密码加密和数据库访问)都保留在安全的 Rust 后端中,而 Vue.js 前端则专注于数据展示和用户交互处理。

数据库设计

数据库包含两个主要表:Records 和 DictData

Records

Records 表是 PassBox 的核心,用于存储所有密码条目及其相关元数据。每条记录通过 UUID 唯一标识,并包含基本信息和时间戳用于追踪。

SQL
CREATE TABLE Records (
    UUID TEXT PRIMARY KEY NOT NULL,
    Name TEXT NOT NULL,
    Identifier TEXT NOT NULL,
    Account TEXT NOT NULL,
    Password TEXT NOT NULL,
    IconType INTEGER NOT NULL,
    IconValue MediumBlob,
    CreateTime BIGINT,
    LastestTime BIGINT
);
点击展开查看更多

字段说明

字段 类型 描述
UUID TEXT 主键,使用 UUID v7 唯一标识每条记录
Name TEXT 密码显示名称
Identifier TEXT 从名称派生的基于拼音标识符,用于搜索
Account TEXT 用户名
Password TEXT 密码
IconType INTEGER 记录的图标类型
IconValue MediumBlob 图标图像的二进制数据
CreateTime BIGINT 记录创建时的时间戳
LastestTime BIGINT 记录最后访问时的时间戳

DictData

DictData 表作为应用程序配置和元数据的键值存储,设计用于存储不适合记录结构的各种类型数据,如加密公钥、应用程序配置、数据库最后被解密的时间等。

SQL
CREATE TABLE DictData (
    Name TEXT PRIMARY KEY NOT NULL,
    TextData TEXT,
    BigIntData BIGINT
);
点击展开查看更多

字段说明

字段 类型 描述
Name TEXT 主键,标识数据条目
TextData TEXT 存储字符串值
BigIntData BIGINT 存储整数值

加密设计

PassBox 将数据库文件以字节的方式进行完全加密,仅在拥有私钥时才能够解密数据库并读取数据。为了在保证存储安全和使用安全的同时,兼顾加密效率,PassBox 采用混合加密方法,结合 RSA 和 AES 算法,充分利用非对称加密和对称加密的优势。

程序逻辑实现

加密算法实现

PassBox 采用混合加密方案,结合RSA非对称加密和 AES-GCM 对称加密的优势。首先通过 PBKDF2 算法从用户密码派生 RSA 私钥,使用 SHA256 哈希和固定盐值,经过10万次迭代增强安全性。加密时生成随机AES密钥,用 AES-256-GCM 加密实际数据,再用RSA公钥加密AES密钥,最后将 AES 加密后的数据、RSA加密后的 AES 密钥和随机 nonce 序列化后作为最终数据。解密过程相反,先用 RSA 私钥解密获得AES密钥,再用 AES 解密数据。这种设计既保证了密钥传输安全,又兼顾了大数据加密效率,同时每次加密使用随机 nonce 确保相同数据产生不同密文。

  graph TD
    A[开始加密] --> B[生成随机AES密钥]
    B --> C[生成随机Nonce]
    C --> D[使用AES-GCM加密数据]
    D --> E[使用RSA公钥加密AES密钥]
    E --> F[打包加密数据包]
    F --> G[序列化数据包]
    G --> H[返回加密结果]
    
    I[开始解密] --> J[从密码派生RSA私钥]
    J --> K[反序列化数据包]
    K --> L[使用RSA私钥解密AES密钥]
    L --> M[使用AES密钥和Nonce解密数据]
    M --> N[返回解密结果]
    
    A -->|密钥派生| O[PBKDF2算法]
    O -->|10万次迭代| P[SHA256哈希]
    P -->|生成种子| Q[RSA私钥]

数据库存取逻辑

采用 SQLite 内存数据库配合文件持久化方案,通过 SQLWrap 类封装所有数据库操作。数据库包含 Records 表存储密码记录和 DictData 表存储配置信息。所有数据在保存时经过加密处理,使用 export_encrypted 方法将内存数据库序列化后加密写入文件,读取时通过 import 方法解密并加载到内存。操作采用互斥锁保证线程安全,每次增删改查后自动调用 save 方法持久化,确保数据一致性。数据库文件包含校验数据防止篡改,提供完整的数据安全保障。

  graph TD
    A[初始化数据库] --> B[创建内存SQLite连接]
    B --> C[执行schema.sql]
    C --> D[创建SQLWrap实例]
    
    E[打开数据库] --> F{数据库文件存在?}
    F -->|是| G[读取加密文件]
    F -->|否| H[使用空数据库]
    G --> I[解密数据]
    I --> I2[校验数据]
    I2 --> J[导入到内存数据库]
    J --> K[数据库就绪]
    
    L[数据操作] --> M[获取互斥锁]
    M --> N[执行SQL操作]
    N --> O[释放互斥锁]
    O --> P[调用save方法]
    
    P --> Q[序列化数据库]
    Q --> R[添加校验数据]
    R --> S[加密数据包]
    S --> T[写入文件]

搜索功能

实现基于拼音和名称的智能搜索,支持中英文混合查询。在创建记录时,系统自动将名称转换为拼音标识符存储在 Identifier 字段中,使用 pinyin 库处理中文转拼音。搜索时通过 LIKE 语句进行模糊匹配,支持部分匹配和包含查询。前端提供搜索框,回车时立即触发后端查询,返回匹配的 SimpleInfo 列表。搜索结果按创建时间或修改时间排序,用户可在设置中配置排序方式,提供快速便捷的密码定位功能。

SQL
SELECT 
	UUID, Name, IconType, IconValue, CreateTime, LastestTime
FROM Records
WHERE Identifier LIKE ?
点击展开查看更多

随机密码生成功能

随机密码生成功能在前端使用 TypeScript 实现,用户可指定密码长度,选择包含数字、大小写字母和自定义符号集。生成算法确保至少包含每种选中的字符类型,使用 Fisher-Yates 洗牌算法随机打乱字符顺序,增强密码随机性。提供参数验证防止无效配置,如长度必须大于0且至少选择一种字符类型。生成的密码符合安全标准,可有效防止暴力破解,为用户创建强密码提供便捷工具。

  graph TD
    F[构建字符池]
    
    F --> G[初始化密码数组]
    G --> H{包含数字?}
    H -->|是| I[添加随机数字]
    H -->|否| J{包含小写字母?}
    
    J -->|是| K[添加随机小写字母]
    J -->|否| L{包含大写字母?}
    L -->|是| M[添加随机大写字母]
    L -->|否| N{包含符号?}
    
    N -->|是| O[添加随机符号]
    N -->|否| P[填充剩余长度]
    
    I --> P
    K --> P
    M --> P
    O --> P
    
    P --> Q[Fisher-Yates洗牌]
    Q --> R[返回最终密码]

云端同步功能

基于 HTTP API 的云端同步机制,支持加密数据库文件的安全上传下载。同步前先比较本地和云端时间戳,自动选择更新方向。上传时将加密数据库文件通过 multipart 表单提交,包含时间戳信息用于版本控制。下载时直接获取最新加密文件并保存到本地路径。使用 header 中的 X-API-Key 进行身份验证,确保数据传输安全。提供手动同步和自动同步选项,用户可在多设备间安全同步密码数据,实现跨设备无缝使用体验。

  graph TD
    A[开始同步] --> B[获取本地时间戳]
    B --> C[获取云端时间戳]
    C --> D{云端更新?}
    D -->|是| E[下载数据库]
    D -->|否| F[上传数据库]
    
    E --> G[发送GET请求]
    G --> H[接收加密文件]
    H --> I[保存到本地路径]
    I --> J[同步完成]
    
    F --> K[导出加密数据库]
    K --> L[构建multipart表单]
    L --> M[添加时间戳]
    M --> N[发送POST请求]
    N --> O[等待响应]
    O --> P{上传成功?}
    P -->|是| J
    P -->|否| Q[返回错误]
    
    R[上传文件] --> S[创建HTTP客户端]
    S --> T[设置X-API-Key头]
    T --> U[构造multipart表单]
    U --> V[发送POST请求]
    V --> W[检查响应状态]
    
    X[下载文件] --> Y[创建HTTP客户端]
    Y --> Z[设置X-API-Key头]
    Z --> AA[发送GET请求]
    AA --> AB[接收文件内容]
    AB --> AC[写入本地文件]

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/passbox-%E5%BC%80%E5%8F%91%E6%96%87%E6%A1%A3/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键