换完手机,GitHub 把我挡在了门外

#2FA#安全#开源#工具

换完手机那天,GitHub 把我挡在了门外。

那天我坐在电脑前,屏幕上弹出来的还是那行熟悉的提示——请输入两步验证代码。我掏出手机打开验证器,列表是空的,一条都没有。换机之前我以为它会跟着微软账号一起同步回来,结果并没有。中间到底卡在哪一步断的,我到现在也说不清。

先翻恢复码,没存;翻邮箱,没有;翻笔记,还是没有。最后只能走申诉:填表、等回复、再补材料,一个账号折腾了好几天才算有个说法。

那几天我一直在想一件事:我的密码一个都没丢,锁是我自己加的,可钥匙不知道被我放哪儿去了。

那些验证器,本来也没打算让你把数据拿走

先说清楚,把验证码放在手机上没有任何问题。Microsoft Authenticator 我用了很多年,平时很顺手,它也确实尽职。

问题是,一直到出事那天我才发现,我从来没搞清楚过几件事:我的数据存在哪里、上一次同步是什么时候成功的、以及万一要用的时候,我能不能把它拿出来。

  • Google Authenticator:同步要连 Google 的服务。在国内能不能连上、什么时候能连上,基本看运气。它可以把账号扫码迁到另一个 App,但不会给你一份能自己保管的备份文件。
  • Microsoft Authenticator:备份锁在微软账号里,跨系统恢复限制不少——在安卓上备份的,往 iPhone 上恢复往往就不行。我这次就是栽在这儿:换完机打开,一条都没有。
  • Authy:注册要手机号,数据在它自己的云上。想手动导出一份,它不给这个选项。
  • 把 2FA 顺手塞进密码管理器(1Password、Bitwarden 之类):确实方便,但等于把密码和验证码放进同一个篮子。篮子漏了一次,二次验证也就白开了——它的全部意义本来就在于"再多一道锁"。

绕一圈你会发现,这些方案都在回答同一个问题:"我的验证码存在谁那儿?" 而答案基本都是"存我这儿就行,你不用管"。

我想要的东西其实很朴素

列出来就五条:

  1. 数据存在本地,最好能用上系统的加密存储;
  2. 能备份到我本来就有的地方——坚果云、自己的 NAS、对象存储,这些我早就在用了,不想再为它单独开个账号;
  3. 备份必须是加密的,网盘服务商拿到也看不懂;
  4. 兼容标准,能从别家导进来,也能导出去,别再添一个孤岛;
  5. 换手机的时候,别再让我把几十个账号一个个重新扫一遍

按这几条筛,能同时满足的其实不多:有些方案得自己搭服务、平时开着浏览器用,而我想要的只是在手机上点一下。

后来我用的是 EasyAuth。

EasyAuth 是什么

一句话:一个开源的 2FA 验证器 App,本地存储、离线可用,并且支持把数据加密备份到你自己的 WebDAV 或 S3 存储。

它是 Flutter 写的,Apache 2.0 协议完全开源,代码公开可审计,没有账号体系、没有遥测、没有广告,也不需要 Google 服务框架。

目前能直接下载安装的是 Android 版 APK(GitHub / Gitee 上都有)。iOS、Windows、Linux 还没有预编译版本,源码是公开的,可以自己编译。

算法上是 TOTP(RFC 6238)和 HOTP(RFC 4226)两种标准,兼容 Google Authenticator 那套 otpauth:// 协议和迁移二维码——意味着它能跟别家互相搬家,不是又一个只能进不能出的孤岛。

界面很朴素:顶上一行搜索框,下面是口令卡片,每张卡片三行——口令名、发行方、当前六位数字,右边一圈倒计时。没有花活,也没有让我盯着看的动画。

它把备份这件事做对了

如果只让我说一个推荐理由,就是备份。

备份存哪儿,你说了算

支持两类:

  • WebDAV:坚果云、Nextcloud,以及群晖、威联通这些自建 NAS 基本都自带;
  • S3 兼容:AWS S3、阿里云 OSS、腾讯云 COS、七牛云、MinIO、Cloudflare R2 这类对象存储。

关键在于"你自己的"这四个字:填的是你自己服务器的地址、你自己的密钥,备份文件进的是你自己的空间。哪天不想用了,文件也还在你自己的空间里,不会因为某个服务关停就跟着消失。

备份本身是加密的

备份文件用 AES-256-GCM 加密,密钥由你设置的备份密码经 PBKDF2-HMAC-SHA256 迭代 60 万次派生。换句话说,你的网盘账号就算被别人拿到了,他下载走那个 zip 也只是一堆乱码。

多版本可回退

备份文件名带时间戳,形如 backup_20260527_120413.zip,默认在远端保留最近 10 份,超出的自动清理。也可以在 App 里直接看到远端有哪些备份、手动删掉不要的,不用专门登录服务器去收拾。

恢复不会手滑

恢复是覆盖式的,所以它一定会先弹一次确认。密码错了、或者备份文件损坏,它会直接报错,不会动你已经存在的数据。这个细节挺重要——恢复本来就是出事的时候才会做的事,那个时刻最不该再出岔子。

上手就三步

  1. 进「设置」→「备份参数配置」,选 WebDAV 或 S3,把地址和各把密钥填进去;
  2. 第一次点备份时,它会让你设一个备份密码——用来加密备份文件;
  3. 点「备份到远端」。主页搜索栏右边那个云图标就是入口,成功会变绿,失败会变红。

第 2 步要多说一句:这个密码一定要另外记好。它只存在你设备的本地加密区,忘掉就没有找回途径,备份文件也就永远打不开了。

还有一点需要提前知道:云盘配置和备份密码都不会写进备份文件(这是刻意的,否则备份文件本身就成了万能钥匙)。所以换新手机的时候,得重新填一次配置和密码,再点「从远端恢复」。比"一键同步"多一步,换来的是备份文件泄露也打不开。

如果原来用的是 Google Authenticator,用「导入」扫一下它导出的迁移二维码,可以一次性搬过来,不用逐个重扫。从 Microsoft Authenticator 那边过来的就没这条路——它不提供迁移到其它 App 的途径,只能照着原来的服务一个个重新加:

最后说清楚风险

得把丑话说在前面:

  • 备份密码没有找回途径。 这既是它的安全性,也是它最大的坑。请把它当成恢复码一样对待——写下来,存到别的地方。
  • 它不该是你唯一的一把钥匙。 我现在的做法是:除了云备份,关键账号的恢复码另外单独存一份,并且隔一段时间真的做一次恢复测试。备份这件事,没验证过就等于没备份——这是我这次教训里最值钱的一条。
  • 口令生成本身不联网,断网照样出码;只有备份和恢复需要网络。
  • 它不是自托管服务,没有网页端、也不需要服务器。数据在手机本地,备份在你自己的网盘,你不需要为它单独准备一台机器。
  • 别再往同一个篮子里加东西。 如果你正打算把 2FA 塞进密码管理器,建议别——那是另一种形式的单点故障。

说在后面

现在我再换手机,流程是:新机器上装好、重新填一次备份配置和密码、点「从远端恢复」。几分钟。

2FA 的意义本来就是把钥匙多放一把在自己手里。既然如此,这把钥匙最好真的在自己手里。

对了,还得交代一句:EasyAuth 是我自己写的,起因就是开头那件事。它完全开源,用得上的话自取:

有问题欢迎在仓库里提 Issue。

你现在的验证码存在哪儿?有没有真的确认过它恢复得回来?这两个问题,建议你今晚花五分钟去看一眼。