前言

我之前一直在使用 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数据库操作软件来查看具体的数据信息。 想要的数据就在 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的是手动添加的第三方账户。

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