前言
同事的手机是鸿蒙的,一家客户的远程环境需要OTP才能进入;
然后这个OTP软件的定制化的,第一次需要与服务器通信注册设备,而程序不支持鸿蒙,哈哈哈;
试了模拟器,程序会报错。。。
最后,用我手机注册,但是一直找我拿OTP手机是很麻烦的。
分析
1. 直接搜索otp
可以看到一个OneTimePassword文件,点进去看一下
一眼看到算法HmacSHA256
,接下来就是要确认它是用什么来做计算密钥的;
2. 找计算密钥
去项目找generateTOTP
发现只有这个文件里面自己调用的,可以看到是使用pushKey
和当前时间进行计算的;
下一步就是找pushKey的生成了;
3. 找pushKey生成算法
可以看到是start在使用,继续溯源;
在Profile里面找到setPushKey的东西,继续溯源;
4. 分析pushKey生成算法
可以看到是deviceId
和ik
SHA后拼接在一起的;
而ik的来源很简单,客户有提供一个二维码直接扫描内容就是json数据,里面就有一个ik。
生成OTP密钥
仿照反编译的代码写一个,跑一下;
然后转base32,在鸿蒙上下载一个F2A的软件,导入就行了。
/** * 操作步骤: * 1. 使用idexpert扫描二维码注册设备 * 2. 将界面的设备ID填入deviceId,去掉连字符 * 3. 使用微信扫描二维码获取json数据,将ik复制出来,填到下方ik中 */ // 去掉连字符 String deviceId = ""; // 二维码内容 String ik = ""; String ikData = HexUtils.bytesToHex(DigestUtils.SHA(ik.getBytes(), 256)); String deviceData = HexUtils.bytesToHex(DigestUtils.SHA(deviceId.getBytes(StandardCharsets.UTF_8), 256)); String pushKeyFirst = ikData.substring(0, 32); String pushKeySecond = deviceData.substring(0, 32); System.out.println(pushKeyFirst); System.out.println(pushKeySecond); String otpKey = pushKeyFirst + pushKeySecond; System.out.println(otpKey); /** * 1. 将hex转成base32 -> https://cryptii.com/pipes/hex-to-base32 * 2. 在手机Auth(F2A)应用程序中添加 * 3. 粘贴base32字符串到“密钥” * 4. 类型TOTP * 5. 哈希函数SHA256 * */https://github.com/msojocs/idexpert-algorithm/
总结
别买homo手机,哈哈哈。