返回> 网站首页
2FA身份认证 - GitHub双重身份验证
yoours2024-03-08 10:22:04
简介一边听听音乐,一边写写文章。
一、前言
认证原理:双方有共同的密钥、相同的时间戳,使用相同的计算方法,最后对结果进行对比实现认证。
为防止双方时间误差和操作上的延迟,会将时间戳改为一段时间窗口使其不变化。
本文基于 https://github.com/beemdevelopment/Aegis 其包括:TOTP、HOTP、Stream、MOTP、YAOTP 认证方式。
二、Github的认证
1. Github使用的是TOTP认证,且密钥为BASE32加密、HmacSHA1、窗口30秒、结果为6位数。
2. 扫描Github认证二维码,扫描结果例如:
otpauth://totp/GitHub:abcdef?secret=WMMFRY7S2PDOW6X3&issuer=GitHub
扫描结果只需要secret的信息,其他可以忽略。
3. 解密secret
使用Base32Decode解密WMMFRY7S2PDOW6X3,得到10个字节的数据0xB3, 0x18, 0x58, 0xE3, 0xF2, 0xD3, 0xC6, 0xEB, 0x7A, 0xFB。
4. 时间戳
使用秒计数 System.currentTimeMillis() / 1000,窗口时间30秒,则 System.currentTimeMillis() / 1000 / 30。
将时间戳转换为8字节大端模式数组。
5. HmacSHA1 哈希计算hash
6. 结果计算
int offset = hash[hash.length - 1] & 0xf;
int otp = ((hash[offset] & 0x7f) << 24)
| ((hash[offset + 1] & 0xff) << 16)
| ((hash[offset + 2] & 0xff) << 8)
| (hash[offset + 3] & 0xff);
otp为计算结果,取十进制低六位数即可。
三、其他认证
认证过程使用共有密钥和相同的随机数,实际上也可以使用自定义的形式实现此类认证。