Skip to content

备份与恢复逻辑

本文档详细描述了 Flauth 备份与恢复系统的实现细节,涵盖了本地文件导出和 WebDAV 云端同步。

1. 概述

Flauth 支持两种备份方式: * 本地文件:将账号导出到设备上的文件,或从现有文件导入。 * WebDAV 同步:使用 WebDAV 协议将您的账号与私有云(如 Nextcloud、坚果云)进行同步。

两种方式共用同一套底层安全架构。

2. 安全架构

为确保 2FA 密钥的安全,Flauth 为备份文件提供了工业级标准的加密保护。

2.1 加密标准

  • 算法: AES-256-CBC (高级加密标准)。
  • 密钥派生: PBKDF2 (基于密码的密钥派生函数 2),配合 HMAC-SHA256。
  • 迭代次数: 10,000 次(兼顾性能与安全性)。
  • 加盐 (Salting): 每次备份都会生成唯一的 16 字节随机盐,以防止彩虹表攻击。
  • 初始化向量 (IV): 每次加密使用 16 字节随机 IV,确保密文的唯一性。

2.2 文件格式

Flauth 统一使用 .flauth 后缀。应用在导入时会自动检测文件内容是加密 JSON 容器还是明文 URI 列表。

加密格式

加密后的备份以 JSON 容器形式存储:

{
  "version": 1,
  "kdf": {
    "algorithm": "pbkdf2",
    "iterations": 10000,
    "salt": "<Base64 编码的盐>"
  },
  "encryption": {
    "algorithm": "aes-256-cbc",
    "iv": "<Base64 编码的 IV>",
    "data": "<Base64 编码的密文>"
  }
}

明文格式

如果用户选择跳过加密,账号将以简单的 otpauth:// URI 列表形式导出,每行一个(同样使用 .flauth 后缀保存)。

3. 工作流程

3.1 导出流程

  1. 收集数据:获取所有账号并转换为 otpauth:// URI 字符串。
  2. 安全选择:提示用户输入密码(至少 6 位)或选择跳过加密。
  3. 加密:如果提供了密码,则派生 256 位密钥并加密内容。
  4. 保存/上传
    • 本地:使用系统文件选择器保存为 .flauth 文件(加密或明文,应用会自动识别内容格式)。
    • WebDAV: 将内容上传到配置的远程路径(默认为 backup-otpauth.flauth)。

3.2 导入流程

  1. 读取内容:从本地存储加载文件字符串,或从 WebDAV 下载内容。
  2. 自动检测:自动检查内容是否为包含加密密钥的 JSON 容器。
  3. 解密
    • 如果是加密文件,提示用户输入密码。
    • 使用 JSON 中存储的盐和迭代次数重新派生密钥。
    • 执行 AES 解密。
  4. 解析:解析生成的 URI 列表,并将新账号添加到本地安全存储中(跳过重复项)。

4. 平台适配说明 (macOS)

针对在无官方代码签名的开发环境下运行应用的 macOS 用户,Flauth 仔细配置了权限(Entitlements),以确保文件选择器在应用沙盒(App Sandbox)内正常工作。