Merge pull request #3393 from HbnKing/v6-dev

add desc  to  TOTP
This commit is contained in:
Golden Looly 2023-11-20 16:36:35 +08:00 committed by GitHub
commit 20978d95c9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -26,6 +26,33 @@ import java.time.Instant;
* 要求客户端和服务器能够十分精确的保持正确的时钟客户端和服务端基于时间计算的动态口令才能一致</p> * 要求客户端和服务器能够十分精确的保持正确的时钟客户端和服务端基于时间计算的动态口令才能一致</p>
* *
* <p>参考https://github.com/jchambers/java-otp</p> * <p>参考https://github.com/jchambers/java-otp</p>
* OTP基于具有时间戳计数器的OTP
* 通过定义纪元T0的开始并以时间间隔TI为单位计数将当前时间戳变为整数时间计数器TC 例如
*
* TC = floor,
* TOTP = HOTPSecretKeyTC
* TOTP-Value = TOTP mod 10d其中d是一次性密码的所需位数
* 像google auth的二步认证使用了这种方式
*
* 认证过程
* 生成二维码,带有otpauth链接的google地址
* 生成公用密钥
* 返回给app同时用户户和服务名也会返回,这时密钥是被base32加密过的,app存储,以后用这个密钥来生成6位校验码
* 服务端同时存储这个密钥和用户名你可以把用户名当key把密钥当value进行存储
* app每30秒生成一个6位校验码,用户使用这个码来网站进行登陆
* 服务器使用存储的密钥+fmac算法生成6位随机数,与客户端传来的数进行对比
* 两个码相等,授权成功,反之,失败.注意服务端可以根据当前登陆的用户名拿到它的密钥有了密钥再进行totp的算法生成校验码
*
*
* 登陆的过程整理
* 用户和密码先登陆
* session里存储了用户名等信息
* 产生二维码及密钥密钥存储到服务器的k/v介质里k使用session里的用户名v使用刚才的密钥
* 客户使用app扫二维码产生新的6位数字
* 客户在用户名和密码登陆后进行验证码页面输入刚才的6位数字
* 提交到服务端服务端根据用户名取出对应的密钥然后使用totp算法生成6位数字
* 如果服务端与客户端数字相同表示登陆成功
*
* *
* @author Looly * @author Looly
*/ */