导出 Duo Mobile 的 OTP 验证码密钥

  • 1398 字
  1. 1. 起因
  2. 2. 准备
  3. 3. 开始
  4. 4. 后记

先说结论, 密钥存储在 /data/data/com.duosecurity.duomobile/files/duokit/accounts.json.
自由软件万岁, ROOT 万岁!

起因

在配置 UCLA 学生账户的过程中, 发现其只支持 Duo Mobile 作为 MFA 验证方式. 然后我就下了一个 Duo, 发现还是 OTP.

为了一个账户多一个 APP, 还得用手机, 真是太烦了, 就想着把密钥导出来.

准备

  • 1 个具有 ROOT 权限的 Android 手机 / 模拟器
  • 1 个支持 ROOT 的文件查看器 APP. 如果没有, 我推荐 CX 文件管理器.

开始

  • 在 Duo Mobile 中导入密钥, 记下密钥的名称 / 备注.

  • 打开文件查看器, 查看 /data/data/com.duosecurity.duomobile/files/duokit/accounts.json, 在所有 name 值中, 找到你刚刚导入的密钥的名称 / 备注.

  • 这一行的下面就是 otpGenerator, 里面有个 otpSecret, 就是我们需要的 OTP 密钥.

    • 如果发现了形似 \u???? (例如 \u003d) 的字样, 这是 UTF-8 字符在 json 中的转义, 需要上网搜索对应的含义并替换. (例如 \u003d 是等于号 =).

    • 当然, 也可以找一些 UTF-8 编解码工具. ==请注意密钥安全! 你不应该把密钥粘贴到任何不信任的服务中!==

    • 文件结构如下 (部分):

    • 
      

    [
    {
    …,
    “name”: “Your Key”,
    “otpGenerator”: {
    “otpSecret”: “XXXXXX”,

    },

    },
    { …其他密钥… }
    ]

    
    
  • 最后, 导入 OTP 密钥到你喜爱的 OTP 验证码客户端中, 例如 Google Authenticator, KeePassXC.

    • PC / Mac 用户可以使用原生平台的 OTP 应用, 例如 Authme, 而无需移动设备 / 模拟器.

后记

有了 OTP 密钥, 就可以在其他 OTP 客户端中使用和同步, 而无需使用专有的 Duo Mobile, 省事又方便.

在此之前, 试过了 Fiddler 抓包和直接发送 cURL 请求. Fiddler 这边, iOS Duo 一直报 NSURLErrorDomain -999, Android Duo 永远连不上, 可能是我配置的问题. cURL 返回了 Signature xxx 错误, 总之也失败了.

失望之际, 看到了 linux.do/~ 上的一个帖子, 正巧手上有个 Rooted Android 手机, 一遍成功, 遂写下此文记录过程. 此文还介绍了 Microsoft Authenticator, 也是通过 ROOT 权限访问数据. 不过我用不到, 不知能否成功.

在此感谢大佬的努力成果, 前人栽树, 后人乘凉.

分享这一刻
让朋友们也来瞅瞅!