Ente Auth 离线模式安全使用指南:本地加密存储、自动备份与恢复实战
2026/9/10 17:04:48 网站建设 项目流程

Ente Auth 离线模式安全使用指南:本地加密存储、自动备份与恢复实战

【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente

导读

Ente Auth(Ente 身份验证器应用)支持不注册账号、不登录 Ente 服务器即可使用:选择Use without backups(不使用备份)进入离线模式后,所有 TOTP 验证码仅保存在当前设备上,不会同步到云端,也无法从 Ente 服务器恢复。本篇指南基于官方文档 offline-mode.md 并结合 mobile/apps/auth 客户端源码,系统讲解离线模式下验证码的存储原理、为什么设备迁移与系统备份不可作为恢复手段、以及在设备或操作系统变更前必须执行的备份与导出方案,帮助你避免因设备重置、系统重装或凭据丢失而永久遗失所有验证码。

离线模式:不使用账号的本地存储

在 Ente Auth 首次使用时,你可以选择Use without backups(不使用备份)直接进入离线模式。这一入口的含义在源码测试中亦有体现:例如 import_success_test.dart 中在导入成功后断言界面上不再出现 "Use without backups" 文案,说明该选项仅出现在未登录、且尚无本地数据的初始状态。

进入离线模式后,需要明确以下几点关键事实:

  • 验证码只存在于当前设备:不写入 Ente 云端数据库,因此任何云同步、多端互备能力均不可用;
  • Ente 服务器无法为你恢复数据:因为没有账号与云端副本,找回验证码只能依赖设备本地或你自己保存的备份/导出文件;
  • 删除应用或清除应用数据即等于丢失验证码:除非你提前做了下文所述的本地备份或加密导出。

从源码结构看,离线模式与账号登录态密切相关:本地备份服务在初始化时会检查Configuration.instance.isLoggedIn()以及是否选择了离线模式(hasOptedForOfflineMode),见 local_backup_service.dart。这也印证了文档的核心提示:离线模式下的数据生命周期完全由设备和本地备份策略决定。

离线存储的工作原理:设备安全存储保护的本地保险库

离线模式下,验证码存放在本地加密保险库中。官方文档明确指出:本地保险库使用一个由设备安全存储(secure storage)保护的密钥进行加密——例如操作系统的 keychain(iOS/macOS)、keyring(Linux)、credential store / secure storage service(Android 及桌面平台)。

这意味着加密链路为:

本地数据库(密文) ← 加密密钥 ← 设备安全存储(不可导出)

因此,如果设备安全存储中的这把密钥变得不可用(例如系统凭据被重置、设备解锁方式变更、跨设备迁移后密钥未随行),那么Ente 仅凭本地数据库的密文也无法恢复离线保险库。源码中同样可以看到应用将备份密码等敏感凭据写入系统级安全存储的痕迹,例如LocalBackupService.init会在离线模式下清理残留的备份密码,_clearBackupPassword调用Configuration.instance.clearBackupPassword()(见 local_backup_service.dart),并在用户退出登录(SignedOutEvent)时同步清理。

为什么设备迁移和系统备份不能当作恢复手段

文档特别强调了两个“不支持”的恢复途径:

  1. 设备间传输(device transfer):迁移工具一般只搬运应用数据文件,不会(或无法)搬运设备安全存储中受硬件/系统保护的密钥;
  2. 操作系统备份(OS backups):即使备份中包含了保险库文件,恢复出来的密钥在新的系统环境下可能因签名、硬件绑定或系统状态差异而无法使用。

简言之:保险库密文 + 缺失的密钥 = 无法解密。这也是文档要求你在任何设备或系统变动前主动创建加密导出或本地备份的根本原因。

在设备或系统变更之前:必做的准备工作

如果你正在离线模式下使用 Ente Auth,在发生以下任一情况之前,必须先完成备份:

  • 重置系统凭据(如重设 PIN/密码、重置 keychain/keyring);
  • 重装操作系统;
  • 更换设备(transferring devices);
  • 恢复设备备份(restoring a device backup);
  • 其他重大系统变更。

操作前请确认三件事:

  1. 确认你知道备份密码——备份或导出文件本身是加密的,密码一旦遗忘,文件等同于无用数据;
  2. 把备份/导出文件存放到独立位置——必须放在变更后仍可访问的地方(如另一台设备、U 盘、自托管存储等),不能只放在将被重装/重置的同一设备上;
  3. 顺带核验一遍密码与文件完整性——建议导出后立即在另一处环境尝试读取一次,验证密码正确、文件未损坏。

应用锁(App lock)不是恢复密码

一个常见误区:把“应用锁”当成验证码的恢复密码。文档明确澄清:

  • 应用锁(App lock)只保护应用 UI 的访问——防止他人在你的设备上打开 App 查看验证码;
  • 它不会对已存储的 Auth 数据重新加密——因此不构成恢复口令,也无法在你丢失设备后帮助你解密保险库或导出文件。

不要指望用应用锁的 PIN/生物识别去解锁备份文件。所有具备恢复能力的凭据,都应当是你在创建备份/导出时单独设置的备份密码

备份你的验证码:本地自动备份与加密导出

这是离线模式下最核心的实操环节。文档给出的路径为:Settings > Data > Local backup(本地备份)与 Data 设置中的导出功能。以下分别展开,并结合源码给出详细行为说明。

方案一:开启本地自动备份(Local backup)

进入Settings > Data > Local backup,对应页面实现位于 local_backup_settings_page.dart。该页面提供如下设置项:

设置项说明
Automatic backups(自动备份)开关(Toggle)。开启后,每次打开 App 时每天自动创建一份本地备份
Set backup password / Update backup password设置或更新备份密码。密码未配置时无法开启备份(见下文流程)
Set backup folder(设置备份文件夹)选择备份文件的保存位置,页面上会显示当前路径
Backup now(立即备份)手动触发一次备份,用于在自动备份周期之外主动保存

自动备份的具体行为可由源码确认(local_backup_service.dart 及字符串资源):

  • 每日一次LocalBackupServicelastBackupDay为键记录上次备份日期,每次打开 App 时若当天尚未备份则执行一次(见 strings_en.arb 中localBackupDailyManualCopy的描述:"Creates one local backup per day when you open the app");
  • 最多保留 5 份_maxBackups = 5,超出后旧备份会被轮换清理(同一条字符串资源:"Backups are retained up to 5 files");
  • 手动备份:点击 "Backup now" 通过triggerAutomaticBackup(isManual: true)立即执行,适合在自动周期前主动保存。

开启自动备份的完整流程见 local_backup_experience.dart:先确保已配置备份密码(_ensurePasswordConfigured)→ 再选择备份位置(_ensureBackupLocationSelected)→ 写入isAutoBackupEnabled偏好 → 立即触发一次自动备份。其中 Android 平台要求必须存在可用的备份目录(noDefaultBackupFolder提示),而 iOS/macOS 上则会校验安全书签(security bookmark)是否仍有效——如果书签缺失(例如系统变更导致),App 会要求你重新选择备份文件夹后再继续(见同文件 第 183-210 行)。这也再次印证了“系统变更会破坏本地恢复能力”的文档结论:变更前请确保备份文件已经导出到外部可访问的位置

方案二:创建加密导出(Encrypted export)

除自动备份外,你还可以从 Data 设置中创建导出文件(data_settings_page.dart 中的 Export 入口,具体实现见 export_widget.dart)。导出提供三种格式:

  1. 加密导出(Encrypted,JSON):推荐方式。导出前要求输入密码(至少 4 个字符),随后使用基于密码派生的密钥加密全部验证码数据,生成一份带版本号、KDF 参数和密文的EnteAuthExportJSON 文件。从 export_widget.dart 可见加密细节:使用随机盐(salt)与 Argon2 类 KDF 派生密钥(包含memLimitopsLimit参数),再用CryptoUtil.encryptData加密明文数据,最终一并写入 JSON。恢复时通过导入功能输入同一密码即可解密(见 encrypted_ente_import.dart 中的_decryptExportData);
  2. 纯文本导出(Plain text,TXT):导出前会弹出风险警告(exportWarningDesc),确认后生成包含验证码明文数据的文本文件,适合导入其他认证器或应急阅读,但明文文件必须自己妥善保管;
  3. HTML 导出(Plain HTML):与 TXT 类似的明文格式,以可读 HTML 页面呈现 OTP 数据。

加密导出的恢复能力不依赖设备安全存储——只要记住密码并保有 JSON 文件,就可以在任何设备上恢复。因此对离线模式用户而言,加密导出是跨越设备/系统变更的最可靠恢复手段

恢复路径:从备份或导出文件导入

虽然离线模式无法云端恢复,但备份与导出文件可以反向导入 Ente Auth:

  • 本地备份:通常用于同一设备上删除 App 后重新安装、或需要回滚到某天备份的场景(App 会按天保留最多 5 份);
  • 加密导出 JSON:通过 Data 设置中的导入功能(Import)选择 Ente 导出文件并输入密码解密导入,可用于跨设备迁移或系统重装后的恢复;
  • 此外还支持从 Aegis、andOTP、Bitwarden、LastPass、OTP Auth、Google Authenticator 等其他认证器导入(见 import 目录),可据此建立自己的迁移方案。

安全实践小结

综合官方文档与源码实现,离线模式用户的正确姿势可归纳为:

  1. 选择离线模式前想清楚:验证码只在本机,删除 App 即丢失;
  2. 日常开启本地自动备份Settings > Data > Local backup,配好密码、选好目录,App 每天自动备份一份(最多保留 5 份);
  3. 系统/设备变更前创建加密导出:用 Data 设置中的 Export 生成带密码的 JSON 文件,并把它放到变更后可访问的独立位置;
  4. 牢记备份密码:密码遗忘 = 备份作废;应用锁 PIN 不能代替备份密码;
  5. 变更后立即验证恢复:在新环境导入导出文件或从备份恢复,确认密码正确、数据完整后再清除旧设备数据。

遵循以上步骤,即可在完全不使用 Ente 账号的前提下,安全、可恢复地长期使用 Ente Auth 离线模式。

【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询