本文共 985 字,大约阅读时间需要 3 分钟。
HS = HMAC-SHA-1(K,C)
DT(HS)//相当于算法分析2-5步 K:秘钥,客户端和服务端都知道,其他第三方不知道 C:在HOTP里面属于计数器 在TOTP里面属于时间戳//第一步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
客户端和服务端都有一个计数器C,并且事先将计数器同步,保持一致。
客户端,使用当前C进行算法计算 HS = HMAC-SHA-1(K,0);DT(HS) 计算成功后,C + 1。 将计算的验证码提交给服务器之后,服务端的C也用上面的公式计算,与客户端提交的验证码进行比对,如果一致,服务端的C + 1 图片来自参考一 参考链接