You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Tauri TS项目中创建SQLite数据库?适配密码存储需求

选择Rust还是TS层创建SQLite数据库(Tauri密码管理器场景)

核心结论

对于密码管理器这类对安全性要求极高的应用,优先在Rust层实现SQLite操作。如果只是做非敏感数据的简单存储、且想复用前端TS技能,也可以考虑TS层,但绝不推荐用于密码这类敏感场景。

为什么优先选Rust层?

  • 安全性更强:密码属于高敏感数据,Rust的内存安全特性能大幅降低内存泄露、缓冲区溢出等风险;且数据库操作在Tauri的Rust核心层执行,不会暴露给前端JS环境,避免前端XSS等漏洞导致的数据泄露风险。
  • 性能更优:SQLite是嵌入式数据库,Rust的原生性能远优于JS/TS的绑定库,在频繁读写或数据量较大的场景下优势明显。
  • Tauri生态适配更顺畅:Tauri本身基于Rust,使用rusqlite这类Rust原生SQLite库,能直接和Tauri的系统权限、窗口事件等API无缝集成。

快速示例(Rust层实现)

  1. 在src-tauri/Cargo.toml添加依赖:
[dependencies]
rusqlite = "0.29"
  1. 在src-tauri/src/main.rs编写数据库操作并通过Tauri Command暴露给前端:
use rusqlite::{Connection, Result};
use tauri::command;

// 定义密码条目结构体
struct PasswordEntry {
    id: i32,
    service: String,
    username: String,
    password: String,
}

// 初始化数据库表
fn init_db() -> Result<Connection> {
    let conn = Connection::open("password_store.db")?;
    conn.execute(
        "CREATE TABLE IF NOT EXISTS passwords (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            service TEXT NOT NULL UNIQUE,
            username TEXT NOT NULL,
            password TEXT NOT NULL
        )",
        [],
    )?;
    Ok(conn)
}

// 暴露保存密码的命令给TS调用
#[command]
fn save_password(service: &str, username: &str, password: &str) -> Result<(), String> {
    let conn = init_db().map_err(|e| e.to_string())?;
    conn.execute(
        "INSERT OR REPLACE INTO passwords (service, username, password) VALUES (?1, ?2, ?3)",
        (service, username, password),
    ).map_err(|e| e.to_string())?;
    Ok(())
}

// 在tauri::Builder中注册命令
fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![save_password])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
  1. 前端TS调用:
import { invoke } from '@tauri-apps/api/tauri';

// 调用Rust层的保存密码方法
async function saveUserPassword(service: string, username: string, password: string) {
  try {
    await invoke('save_password', { service, username, password });
    console.log('密码保存成功');
  } catch (err) {
    console.error('保存失败:', err);
  }
}

什么时候考虑TS层?

  • 你对better-sqlite3这类TS SQLite库极为熟悉,想快速搭建非敏感场景的原型;
  • 存储的数据不涉及隐私或安全风险(但密码显然不在此列)。

注意:TS层的SQLite操作在前端JS环境执行,密码明文可能在JS内存中留存,存在被窃取的风险;且Tauri前端基于WebView,前端漏洞可能直接影响数据安全。

关键补充建议

无论选择哪一层,密码绝对不能明文存储。优先在Rust层用ring或rust-crypto等库完成加密后再写入数据库,尽量减少敏感数据在JS环境的暴露机会。

内容的提问来源于stack exchange,提问作者Maksim Momcilovic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 15:08:06