从 Authy 迁移到 Ente Authenticator:四种导出方案与导入实操完全指南
【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente
本文基于 ente 仓库中的 Authy 迁移指南 整理扩充。Authy 已停止支持其桌面应用,无法再从 App 内直接导出 2FA 验证码,本文覆盖当前仍可用的四种导出路径(终端导出工具、社区脚本、root 安卓设备、iOS 中间人抓包),并结合 ente 移动端源码 逐条讲解如何将导出的明文/JSON 文件安全导入 Ente Authenticator。
从 Authy 迁移到新的一次性密码(2FA)验证器,最麻烦的一点在于 Authy 客户端本身不提供“导出全部验证码”的功能——这意味着如果你不借助外部手段,就不得不为每一个账户重新配置 2FA。不过,社区已经有多种成熟方案可以从 Authy 中导出你的 TOTP 密钥,再批量导入 Ente Authenticator。本文按操作难度从低到高,介绍四种常用方法,并给出对应的 Ente 侧导入步骤,以及迁移完成后的安全清理建议。
[!CAUTION]
安全警告(务必先读)
- 无论使用哪种方法,导出的 JSON 与 TXT 文件都包含你所有账户的未加密 TOTP 密钥,严禁在任何渠道分享这些文件!
- 这些方法不保证能导出你 Authy 账户中的全部验证码。在确认所有账户都成功导入 Ente Authenticator 之前,不要删除 Authy 中的任何验证码。
- 迁移完成后,建议删除本地生成的明文 JSON/TXT 导出文件(见文末“迁移后的安全清理”)。
背景:为什么 Authy 无法直接导出,以及现阶段的方案格局
Authy 长期以来只允许用户在应用内逐条查看验证码,并不提供批量导出明文 TOTP 密钥的入口。以前社区有两种广为人知的导出方式(基于 Authy 桌面客户端数据),但Authy 已停止维护桌面应用,这两种方式现已失效:
[!WARNING]
Authy 已放弃对其桌面应用的全部支持。本文的方法 1、方法 2 已无法再用于导出数据。当前可用的路径是:
- 方法 3:拥有一台root 过的安卓手机(Android 6 及以上,且通过 Play Integrity 校验);
- 方法 4:拥有一台iOS 设备与一台电脑(配合抓包/中间人解密流程)。
也就是说,现在的选择本质上是:root 安卓手机或iOS 设备 + 电脑二选一。下面两种方法分别面向这两类环境,你可以按自己的设备条件挑选。
方法 1:使用 Neeraj 的 Authy 导出工具(自动化程度最高)
适用人群:希望跳过繁琐技术步骤、直接进入导入环节的普通用户。
社区开发者 ua741 维护了一个开源的authy-export命令行工具,可以自动完成 Authy 数据的解密与导出,输出 Ente Authenticator 可直接识别的明文格式。
操作步骤
- 从该工具的 Release 页面下载适配你操作系统的二进制文件(支持 macOS、Linux、Windows)。
- 在终端中执行(假设二进制文件名未修改、且终端当前目录就是二进制所在目录):
./<binary-name> <path_to_export_file>各系统对应的完整命令示例:
# macOS(注意:Apple Silicon 设备可能需要先安装 Rosetta 2 才能运行) ./authy-export-darwin-amd64 authy_codes.txt # Linux ./authy-export-linux-amd64 authy_codes.txt # Windows ./authy-export-windows-amd64.exe authy_codes.txt[!NOTE]
在 Apple Silicon(M1/M2 等)设备上运行该工具时,Rosetta 2 可能是必需的,请提前在系统设置中安装。
- 命令执行完成后,会在当前目录生成一个名为
authy_codes.txt的文本文件,其中包含你的 Authy 验证码,格式即为 Ente 的明文导出格式。
接下来,直接跳转到下文「导入到 Ente Authenticator(方法 1 / 2.1 / 4)」一节完成导入。
方法 2:使用 gboudreau 的社区导出指南(Bitwarden JSON 格式)
适用人群:有一定动手能力、希望采用社区公认成熟方案的进阶用户。
GitHub 用户 gboudreau 编写了一份从 Authy 导出验证码的详细指南(由 morpheus 在 Discord 中发现并分享给作者)。按该指南操作后,会生成一个名为authy-to-bitwarden-export.json的 JSON 文件,其结构为Bitwarden 导出格式,Ente Authenticator 原生支持直接导入。
请先完成该指南中的导出步骤,再根据你的结果走下面的分支:
- 若导出成功且导入也成功:直接进入下文「导入到 Ente Authenticator(方法 2)」。
- 若导出成功但导入失败:见下文「方法 2.1」。
- 若导出本身失败:说明该方法已因 Authy 限制而失效,请改用方法 1(若可用)或方法 3 / 方法 4。
方法 2.1:导出成功但导入失败时的兜底转换(Python 脚本)
[!NOTE]
本节仅适用于「用方法 2 成功导出了验证码,但导入 Ente Authenticator 失败」的用户。如果导入已成功,或尚未尝试导入,请忽略本节。
正常情况下,Bitwarden 格式的导出可以直接导入 Ente Authenticator。若因某些原因导入失败,可以先用下面这个 Python 小程序把 JSON 文件转换成 Ente 能识别的 TXT 明文文件,再改用「明文导入」:
import json import os totp = [] accounts = json.load(open('authy-to-bitwarden-export.json','r',encoding='utf-8')) for account in accounts['items']: totp.append(account['login']['totp']+'\n') writer = open('auth_codes.txt','w+',encoding='utf-8') writer.writelines(totp) writer.close() print('Saved to ' + os.getcwd() + '/auth_codes.txt')运行前提与注意事项:
- 电脑上需要安装Python 3。
- 运行前务必保证Python 脚本与
authy-to-bitwarden-export.json位于同一目录,否则程序无法读取文件。 - 运行方式二选一:
- 直接在 IDE 中打开脚本并运行;
- 或在终端执行:
- macOS / Linux 及任何使用 bash 的系统:
python3 authy_to_ente.py - Windows:
py -3 authy_to_ente.py
- macOS / Linux 及任何使用 bash 的系统:
运行成功后会在当前目录生成auth_codes.txt,接下来按「导入到 Ente Authenticator(方法 1 / 2.1 / 4)」的明文导入流程操作即可。
方法 3:在 root 安卓设备上导出(Android OTP Extractor / Aegis)
适用人群:拥有root 权限、且系统为Android 6 或更新版本、能通过Play Integrity校验的进阶用户。
该方法需要一台已 root 的安卓手机,通过读取 Authy 在本机存储的加密数据来导出验证码。下面提供两条路线,任选其一。
路线 A:使用 Android OTP Extractor
puddly 开发的 Android OTP Extractor 可以直接从已安装的应用中提取 TOTP 密钥,并以二维码 / otpauth URL 的形式输出。
准备电脑环境:安装 Python 3,并从 Android 官方平台工具页下载 adb(Android Debug Bridge)二进制。
将 adb 加入系统 PATH(以 Windows 为例):
- 搜索并打开“编辑系统环境变量”;
- 点击“环境变量”;
- 在顶部“用户变量”中找到
Path变量并点击“编辑”; - 点击“新建”,填入你解压 Platform Tools 的路径。
在手机上开启 USB 调试:
- 打开“设置” → 进入“关于手机”(平板设备可能显示为“关于平板”,若已开启开发者选项可跳过下列两步);
- 连续点击“版本号”7 次或更多;
- 返回设置主页面 → 进入“系统设置” → “开发者选项”;
- 打开“USB 调试”开关;
- 在电脑上运行
adb devices确认设备已被识别(手机上可能会弹出“允许”提示,需要点击允许以授权电脑访问)。
用 pip 安装 Android OTP Extractor:
pip install git+https://github.com/puddly/android-otp-extractor从 Play 商店安装 Authy 并登录你的账户。
运行以下命令导出 TOTP(以二维码与 URL 形式输出):
python -m android_otp_extractor --prepend-issuer --include authy
导出结果会在浏览器中以二维码 + otpauth URL 的形式展示,方便下一步在 Ente Authenticator 中逐个扫描导入(见「导入到 Ente Authenticator(方法 3)」)。
路线 B:使用 Aegis Authenticator
beemdevelopment 开发的 Aegis Authenticator 内置了“从 Authy 导入”的能力,可借助 root 权限直接完成迁移,再导出为 JSON / TXT。
- 在已 root 的手机上安装 Authy 并登录。
- 从 Google Play 商店安装 Aegis Authenticator。
- 打开 Aegis,点击右上角三个点菜单 →导入与导出。
- 选择“从其他应用导入”,然后选择Authy。
- 应用会请求 root 权限,授权后自动从 Authy 导入全部验证码。
- 回到“导入与导出”菜单,使用“导出到文件”将验证码导出为
json或txt文件。
导出的文件格式与 Ente Authenticator 的导入选项对应:JSON 走 Bitwarden 式导入,TXT 走明文导入。可按下文对应流程操作。
方法 4:Authy-iOS-MiTM(iOS 设备 + 电脑)
适用人群:技术型 iOS 用户,且因方法 1 / 2 已被修补无法使用、也没有 root 安卓设备(方法 3 不可用)的情况。
该方法的核心原理是:在 Authy 应用首次登录时拦截其接收到的网络数据,其中包含你账户的加密验证器令牌(encrypted authenticator tokens)。拿到加密令牌后,再使用你的**备份密码(backup password)**进行解密,最后转换成 Ente 可识别的令牌文件。
流程分为两步:
- 获取并解密加密令牌:参考社区维护的 Authy-iOS-MiTM 指南(更新版本),或 原始版指南。
- 转换为 Ente 可识别的格式:原始指南会生成
decrypted_tokens.json,使用对应的 Python 脚本将其转换为ente_auth_import.plain文件;然后将该文件传输到装有 Ente Authenticator 的设备上,按下方「导入到 Ente Authenticator(方法 1 / 2.1 / 4)」的明文导入流程操作。
导入到 Ente Authenticator:按导出格式选择导入入口
导出工作完成后,你会得到以下三种产物之一,Ente 的导入入口相应有两种:
| 导出方法 | 产物格式 | 导入入口 |
|---|---|---|
| 方法 1 / 方法 2.1 / 方法 4 | TXT 明文(或.plain) | Plain text(明文导入) |
| 方法 2 | Bitwarden JSON | Bitwarden |
| 方法 3 | JSON / TXT / 二维码 | 按文件类型选择对应入口,或扫描二维码 |
导入到 Ente Authenticator(方法 1 / 2.1 / 4 —— 明文 TXT 导入)
- 将 TXT 文件复制到装有 Ente Authenticator 的设备上。
- 登录你的账户(如果尚未登录),或点击“不备份使用 / Use without backups”。
- 打开左上角导航菜单(汉堡按钮),进入Data(数据)→Import codes(导入验证码)。
- 选择Plain text(明文)选项。
- 选择之前生成的 TXT 文件。
明文格式说明(来自 Ente 移动端导入页):明文文件中的每一行应为一条otpauth://格式的 URI,例如:
otpauth://totp/provider.com:you@email.com?secret=YOUR_SECRET从源码看,明文导入解析器 会先判断内容是否以otpauth://开头:是则按otpauth://逐行(或按逗号分隔)解析为验证码;否则尝试按 JSON 对象解析,读取其中的items数组。因此,若你的 TXT 内容实际为 JSON 结构(如方法 2.1 转换产物之外的 JSON),解析器也能兼容处理。单条记录解析失败不会中断整体导入,合法的条目仍会被保留。
导入到 Ente Authenticator(方法 2 —— Bitwarden JSON 导入)
- 将 JSON 文件复制到装有 Ente Authenticator 的设备上。
- 登录你的账户(如果尚未登录),或点击“不备份使用 / Use without backups”。
- 打开左上角导航菜单(汉堡按钮),进入Data(数据)→Import codes(导入验证码)。
- 选择Bitwarden选项。
- 选择之前生成的 JSON 文件。
如果这一步失败,请回到方法 2.1改用明文导入。
导入到 Ente Authenticator(方法 3 —— 扫描二维码)
- 打开手机上的 Ente Authenticator。
- 登录你的账户(如果尚未登录),或点击“不备份使用 / Use without backups”。
- 点击应用右下角的添加按钮。
- 选择“扫描二维码 / Scan a QR code”,扫描浏览器(或 Android OTP Extractor 输出)中的二维码。
附录:Ente Authenticator 的导入机制与源码印证
为了让你对导入过程更放心,这里结合 ente 仓库的移动端源码说明一下 Ente 侧到底做了什么:
导入入口:Ente Authenticator 的“导入验证码”入口位于设置页面的 Data 区域。在 data_settings_page.dart 中,「导入验证码」与「导出验证码」「重复验证码」并列展示。点击后进入 import_page.dart,其
ImportType枚举与importOptions列表列出了全部支持的导入来源,包括plainText(明文)、bitwarden(Bitwarden)、aegis(Aegis)、twoFas(2FAS)、andOTP、googleAuthenticator、proton、ravio、lastpass、otpAuth、encrypted(Ente 加密格式)——你在 App 里看到的每个导入选项都有对应的实现文件。导入分发:import_service.dart 中的
ImportService.initiateImport()按类型把操作分发给对应的导入模块,例如 Bitwarden 对应 bitwarden_import.dart,明文对应 plain_text_import.dart。Bitwarden JSON 的解析:bitwarden_import.dart 会读取 JSON 中的
items数组,逐条判断login.totp字段:若 TOTP 是otpauth://URL 则按 URL 解析;若是steam://前缀则按 Steam 类型解析;否则以name作为 issuer、login.username作为 account、login.totp作为密钥构造 TOTP 验证码。同时还会尝试把folderId映射为标签(tags)附加到验证码上,从而保留你在 Bitwarden/Authy 侧的分组信息。保存与同步:所有导入模块最终都会调用 import_flow.dart 中的
saveImportedCodes():先将解析出的验证码逐条写入本地的CodeStore(暂不同步),随后触发一次AuthenticatorService.onlineSync(),把新导入的验证码同步到云端——因此导入完成后你的其他设备也会自动获得这些验证码(前提是已登录同一账户)。验证码模型:code.dart 中的
Code.fromOTPAuthUrl()(code.dart)负责把otpauth://URI 解析为Code对象,支持从 URI 中提取 issuer、account、digits、period、algorithm、counter 等参数,并会处理账户名中未转义的#字符等边界情况。fromExportJson()(code.dart)则用于从 Ente 自己的导出 JSON 恢复验证码。如果你后续想从 Ente 再导出(例如备份),data_settings_page.dart 中同样提供了「导出验证码」入口。
迁移后的安全清理
迁移完成后,你的 TOTP 密钥已安全存储在 Ente Authenticator 中(本地加密存储 + 可选云端端到端加密同步)。出于安全考虑,强烈建议删除迁移过程中产生的所有未加密 JSON 与 TXT 文件(例如authy_codes.txt、authy-to-bitwarden-export.json、auth_codes.txt、ente_auth_import.plain),因为这些文件一旦泄露,等同于你的所有 2FA 密钥一并泄露。
同时请记住本指南开头的提醒:在确认所有账户均已成功导入 Ente Authenticator 之前,不要从 Authy 中删除任何验证码——迁移这件事,稳妥比速度更重要。
【免费下载链接】ente💚 End-to-end encrypted cloud for everything.项目地址: https://gitcode.com/GitHub_Trending/en/ente
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考