惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
I
InfoQ
人人都是产品经理
人人都是产品经理
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
Hugging Face - Blog
Hugging Face - Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
SegmentFault 最新的问题
美团技术团队
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
Last Week in AI
Last Week in AI
博客园_首页
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
L
LangChain Blog
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
宝玉的分享
宝玉的分享
G
Google Developers Blog
博客园 - 叶小钗
博客园 - Franky

吹比💨

NFS 服务引发的一次“诡异”应急响应 银狐使用WDAC来对抗杀软 浏览器第三方Cookie保护导致无法使用Github.dev 使用pushState伪造浏览器地址栏 一次排查网站劫持过程流水账 使用CloudFlare的IP Lists功能来做访问控制 FrontJS网站错误监控插件存在弹窗广告 宝塔面板可能存在未知漏洞的分析与处置方法 CDN厂商解决域前置问题 中文域名那些事 TLS握手指纹(JA3/JA3S)检测恶意软件流量 [A-Z]{2}\d{2}.cc 团伙的一些公开信息 Azure旗下奇怪的静态托管服务 Csrf与浏览器第三方Cookie策略的问题 Pppoe密码嗅探 Publicsuffix那些事 一次有意思的域名追踪 CobaltStrike通信中host字段的获取 XFF那些事 CORB那些事 Referrer Policy那些事 使用CloudFlare来为网站开启客户端证书验证 DNS那些事 用flask来在线管理你的iptables 屏蔽掉向日葵的有效方法 帝国cms在防止内容采集方面做的工作 身份验证器是如何验证我们的身份? 利用GoogleAppsScript自动回复短信实现保号 Nginx实用模块 有关跨域请求的一些记录
手动导出 Microsoft Authenticator 中的2FA密钥
榆木 · 2023-10-05 · via 吹比💨

前言

我之前一直在使用 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直接生成二维码进行扫码导入。