博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google两步验证
阅读量:3748 次
发布时间:2019-05-22

本文共 985 字,大约阅读时间需要 3 分钟。

  1. HOTP:计数器验证
  2. TOTP:时间戳验证

算法公式

HS = HMAC-SHA-1(K,C)

DT(HS)//相当于算法分析2-5步
K:秘钥,客户端和服务端都知道,其他第三方不知道
C:在HOTP里面属于计数器
在TOTP里面属于时间戳

算法分析

  1. 通过K和C生成一个容量为20的byte数组,byte[] a;
  2. 取最后数组a的最后一位,和0xF相余,也就是取最后一位的低四位,作为偏移量
  3. 取偏移量开始的第一个整形字节
  4. 将第三部取得的整形自己与0x7FFFFFFF相&,&完就相当于取后31位
  5. 将第四部的值模除10^6,就会得到6位验证码
//第一步byte[] hash = signer.sign(challenge);//第二步int offset = hash[hash.length - 1] & 0xF;//取数组最后一个字节的低四位作为偏移量//第三步,第四步int truncatedHash = hashToInt(hash, offset) & 0x7FFFFFFF;//取后31位//第五步int pinValue = truncatedHash % DIGITS_POWER[codeLength];//最后验证码要求六位就%10^6return padOutput(pinValue);//不够6位补0

TOTP

  1. 客户端和服务端都有统一约定的K,用客户端生成验证码前,需要和服务端校准时间。通常是发送一个网络请求,在响应头中得到服务器的时间。将偏差的时间与System.currentTimeMillis()函数相加,就可以和服务端时间同步。
  2. 客户端和服务端还要约定一个有效时间周期,用于在某个时间周期更换验证码,一般为30s。
  3. 但是由于网络原因,客户端生成密码时间和服务器接受密码的时间还可能存在延迟,服务器会需要有一个延迟策略,可以允许验证前一个有效时间周期的验证码。
    这里写图片描述
    图片来自参考二
    这里写图片描述
    图片来自参考二

HOTP

客户端和服务端都有一个计数器C,并且事先将计数器同步,保持一致。

客户端,使用当前C进行算法计算
HS = HMAC-SHA-1(K,0);DT(HS)
计算成功后,C + 1。
将计算的验证码提交给服务器之后,服务端的C也用上面的公式计算,与客户端提交的验证码进行比对,如果一致,服务端的C + 1
这里写图片描述
图片来自参考一
参考链接

你可能感兴趣的文章
spark常见算子
查看>>
scala符号初体验
查看>>
kafka生产者常用参数含义
查看>>
mysql编写函数
查看>>
面试笔试题之hql
查看>>
sql函数之cast()
查看>>
hql中substr函数截取字符串匹配
查看>>
mysql之指定ip、用户、数据库权限
查看>>
zookeeper的读和写数据流程(有图欧)
查看>>
bin/schematool -dbType mysql -initSchema HiveMetaException: Failed to get schema version.
查看>>
flink知识总结
查看>>
flink之检查点(checkpoint)和保存点(savepoint)的区别
查看>>
Linux系统编程---进程I/O
查看>>
spring学习知识补充
查看>>
杂文之生成随机字符串
查看>>
springBoot基础(一)
查看>>
springBoot基础(二)
查看>>
在springBoot中使用Mapper类问题
查看>>
filebeat___log -input
查看>>
GitHub使用
查看>>