手动导出 Microsoft Authenticator 中的2FA密钥

作者: maofun 分类: 代码 发布时间: 2024-08-29 13:28

前言

我之前一直在使用 Google Authenticator,后因 Microsoft Authenticator 拥有云备份功能,所以转移到后者。云备份功能可以方便的让我们在更换设备以后无痛进行迁移,但是因为 Microsoft Authenticator 本身没有导出密钥的功能,所以导致我一直无法迁移存量数据到新的其他相关应用。今天找到了破解之道,且没搜索到中文相关内容,简单做下翻译水篇文章,希望能帮到更多屈服于微软淫威之下的人。

步骤

    1. 找到数据
      Microsoft Authenticator 中的2FA密钥数据存储路径为 /data/data/com.azure.authenticator/databases/PhoneFactor。由于是在/data/目录下,所以需要手机Root才能查看到。如果你没有Root也不用怕,完全可以迂回的通过云备份功能同步到其他Root后的手机或者模拟器中再进行操作。
    2. 读取数据
      PhoneFactor 文件本身是Sqlite数据库文件,所以复制文件时候需要复制PhoneFactor-shm和PhoneFactor-wal这两兄弟(如果有),可以通过Sqlite数据库操作软件来查看具体的数据信息。手动导出 Microsoft Authenticator 中的2FA密钥想要的数据就在 accounts 表中。我这里就直接让chatgpt写了一个导出脚本。

      import sqlite3
      import uuid
      import json
      
      # 连接到SQLite数据库
      conn = sqlite3.connect('PhoneFactor')
      cursor = conn.cursor()
      
      # 执行SQL查询,仅选择account_type为0的行
      cursor.execute("SELECT name, username, oath_secret_key FROM accounts WHERE account_type = 0")
      
      result = []
      
      # 遍历查询结果,并创建所需的JSON对象
      for row in cursor.fetchall():
          name, username, secret_key = row
          uuid_str = str(uuid.uuid4())
          otpauthstr = f"otpauth://totp/{name}:{username}?secret={secret_key}"
          result.append({
              "uuid": uuid_str,
              "otpauthstr": otpauthstr
          })
      
      # 关闭数据库连接
      conn.close()
      
      # 将结果以JSON格式输出
      output_json = json.dumps(result, indent=4)
      print(output_json)
      

      account_type为1的是微软本身的账户,为0的是手动添加的第三方账户。

  1. 导入数据
    拿到数据以后我们可以导入到自己想要使用的任意软件了,可以手动输入secret_key,也可以直接将上面otpauth://开头的url直接生成二维码进行扫码导入。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注