返回> 网站首页 

2FA身份认证 - GitHub双重身份验证

yoours2024-03-08 10:22:04 阅读 801

简介一边听听音乐,一边写写文章。

一、前言

    认证原理:双方有共同的密钥、相同的时间戳,使用相同的计算方法,最后对结果进行对比实现认证。

    为防止双方时间误差和操作上的延迟,会将时间戳改为一段时间窗口使其不变化。

    本文基于 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为计算结果,取十进制低六位数即可。

三、其他认证

    认证过程使用共有密钥和相同的随机数,实际上也可以使用自定义的形式实现此类认证。


微信小程序扫码登陆

文章评论

801人参与,0条评论