将 Dkey Token (宁盾令牌)转换为标准 TOTP
这篇文章是从英文版本翻译而来,可能做不到文从字顺。
啥是 TOTP
TOTP 是 2FA 的一种,全称为 Time-based One-Time Password,是一种根据预共享的密钥与当前时间计算一次性密码的算法,用于从一串固定的 secret 中生成动态的 6 位或 8 位的动态口令。用户和服务器所持有的 secret 是一样的,该 secret 理想情况下只有用户和服务器双方持有,是一串二进制数据,为了便于传播,该 secret 会经过 base32 编码,然后去掉最后一位=
。
背景
一般来说,一所高校的 IT 部门提供 VPN 服务是很正常的。学生只需下载 Cisco AnyConnect 应用程序并输入他们的用户名/密码,然后单击“连接”以连接到他们学校的局域网,并在家中或校外使用它来访问仅限在校内使用的服务或访问一些数据库,如 CNKI (知网)或 IEEE-Xplore。两步验证是必要的,因为这能在学生的账号密码泄漏后,防止非法人士利用 VPN 进入学校内网。
我们学校使用的是 Dkey Token(宁盾令牌),但总有一些同学会遇到不小心卸载了 app、手机数据损坏或更换手机等问题。正常的步骤是向 ITSC 提交工单或 Workflow,要求他们解除绑定并在校园内网重新激活 2FA。但是,ITSC 处理这些步骤的时间很长,学生在手机上做一些操作也很困难。他们甚至不知道什么是 2FA。
而我找到了一种从 Dkey Token 导出 seed 并将 seed 导入其他 2FA 应用程序的方法,例如 HE Network 中的 One Time Password、CanoKeys、Microsoft Authenticator 等。
开工
我们的 ITSC 提供了帮助我们学生自行安装宁盾令牌的说明。 这儿还有一个二维码供我们扫描。
二维码的内容是(内容已经脱敏)
http://mtc.ndkey.com/mtc/appDownload/index.html#eyJ2ZXJzaW9uIjoxLCJzZXJ2aWNlSWQiOiJTTjExNDUxNDE5MTk4MSIsImNvbXBhbnlOYW1lIjoi5YWs5Y+45ZCN56ewIiwiYWN0aXZhdGlvbk1ldGhvZCI6Miwic2VydmljZUFkZHJlc3MiOiIxMS40LjUuMTQiLCJzZXJ2aWNlUG9ydCI6NDQzLCJ0ZW5hbnRJZCI6ImRlYWRiZWVmLWNhZmUtYmFiZS1mYWNlLWRlYWRiZWVmY2FmZSJ9
(这一步疑似没有作用)我们使用 echo <base64data> | base64 -d
解码它并得到(内容已经脱敏)
{
"version": 1,
"serviceId": "SN114514191981",
"companyName": "公司名称",
"activationMethod": 2,
"serviceAddress": "11.4.5.14",
"servicePort": 443,
"tenantId": "deadbeef-cafe-babe-face-deadbeefcafe"
}
使用宁盾令牌扫描该二维码,在激活过程中,我使用数据包捕获软件抓包。(仅供参考,内容有些年头了)
{
"requestId": null,
"success": true,
"errorCode": 0,
"errorId": null,
"data": "{\"serial\":\"114514\",\"crypto\":1,\"seed\":\"beefbeefbeefbeefbeefbeefbeefbeefbeefbeef\",\"timeStep\":60,\"passwordLength\":6}",
"message": null
}
现在我们得到了 seed。注意 timeStep 和 passwordLength,分别表示一次性密码的有效期和密码长度位数。seed 是 hexString 格式(也就是十六进制字符的字符串)的 secret,最终需要进行 base32 编码后才能使用。
获得 base32 编码后的 secret
使用这个网站:https://emn178.github.io/online-tools/base32_encode.html
这样我们就能获得 base32 编码后的 secret 了。
将 secret 导入第三方应用程序
现在我们可以自己用它来获取 TOTP。 我们可以在 HE Network Tools、CanoKeys、Microsoft Authenticator 等 App 中导入并激活 TOTP 了。