562 字
3 分钟
宁盾令牌转标准2FA TOTP
2020-05-19
无标签

作为一个强迫症,我希望我能用统一的APP管理我的一次性密码,而公司提供的宁盾一次性验证码,却只能用宁盾令牌管理。不能使用统一管理工具管理,这让强迫症怎么办,还需要多下载一个APP。经过我的研究,发现宁盾是使用标准TOTP算法生成一次性密码的,现在把它提供的种子密钥加工成符合otpauth规范的地址就可以由其它应用管理了。

2211583406022_.pic_hd-w387

获取宁盾二维码内容#

绑定宁盾令牌时,解码这个二维码,获得文本

http://mtc.ndkey.com/mtc/appDownload/index.html#eyJ2ZXJzaW9uIjoxLCJzZXJ2aWNlSWQiOiJzZXJ2aWNlSWQiLCJjb21wYW55TmFtZSI6IuWFrOWPuOWQjSIsImFjdGl2YXRpb25NZXRob2QiOjEsImV4cGlyZVRpbWUiOjE1MTExMTY5NjQzNDUsInRva2VuIjp7InNlcmlhbCI6IjEyMzQ1NiIsInNlZWQiOiI0ODY1NmM2YzZmMjFkZWFkYmVlZiIsInRpbWVTdGVwIjo2MCwicGFzc3dvcmRMZW5ndGgiOjYsImV4cGlyZVRpbWUiOjIyMTE0NTIxNjEwMDB9fQ

这个文本是一个url,获取这个url中#后的部分,将这部分使用base64解码。如果不能解码,在后面追加一个=

eyJ2ZXJzaW9uIjoxLCJzZXJ2aWNlSWQiOiJzZXJ2aWNlSWQiLCJjb21wYW55TmFtZSI6IuWFrOWPuOWQjSIsImFjdGl2YXRpb25NZXRob2QiOjEsImV4cGlyZVRpbWUiOjE1MTExMTY5NjQzNDUsInRva2VuIjp7InNlcmlhbCI6IjEyMzQ1NiIsInNlZWQiOiI0ODY1NmM2YzZmMjFkZWFkYmVlZiIsInRpbWVTdGVwIjo2MCwicGFzc3dvcmRMZW5ndGgiOjYsImV4cGlyZVRpbWUiOjIyMTE0NTIxNjEwMDB9fQ

解码后可以得到一个json串,如下

{
"version": 1,
"serviceId": "serviceId",
"companyName": "公司名",
"activationMethod": 1,
"expireTime": 1511116964345,
"token": {
"serial": "123456",
"seed": "48656c6c6f21deadbeef",
"timeStep": 60,
"passwordLength": 6,
"expireTime": 2211452161000
}
}

重要字段说明:

token.seed 用于生成一次性密码的key token.timeStep 一次性密码的有效期,单位秒 token.passwordLength 密码长度 这几个字段再后面会用到

生成secret#

seed是一个hex string格式的种子,需要处理成secret才能使用

先将seed由hex string解密binary,再进行base32加密,得到的值就是secret

使用shell处理

Terminal window
echo '48656c6c6f21deadbeef' | xxd -r -p | base32

使用java处理

4.6.6
String secret = Base32.encode(HexUtil.decodeHex("48656c6c6f21deadbeef"));

生成otpauth url#

栗子

otpauth://totp/$用户名?secret=$secret]&issuer=$公司&algorithm=SHA1&digits=6&period=60

$用户名处可以替换成你的账户名 $secret 替换为上一步得到的值 $公司 替换为公司名 algorithm 不需要动,默认用SHA1算法 digits 密码长度,替换为上文中的token.passwordLength period 一次性密码有效期,替换为上文中的token.timeStep

得到的最终url可以直接粘贴到谷歌令牌、微软令牌、1Password等软件使用。也可以生成二维码扫描

终极命令#

/tmp/abc是二维码获取到的文本

Terminal window
cat /tmp/abc \
| awk -F# '{printf "%s=",$2}' \
| base64 -d \
| jq .token.seed -r \
| xxd -r -p \
| base32 \
| awk '{printf "otpauth://totp/[用户名]?secret=%s&issuer=[公司]&algorithm=SHA1&digits=6&period=60",$1}' \
| qrencode -o - \
| open -f -a Preview

参考文档#

宁盾令牌转标准2FA TOTP
https://www.jianyun.run/posts/convert-ningdun-token-to-standard-2fa-totp/
作者
唐长老日志
发布于
2020-05-19
许可协议
CC BY-NC-SA 4.0