先说结论, 密钥存储在 /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 权限访问数据. 不过我用不到, 不知能否成功.
在此感谢大佬的努力成果, 前人栽树, 后人乘凉.