【TOTP】TOTP算法(基于时间的一次性动态密码)原理介绍 & 简要逻辑实现说明

6 篇文章 0 订阅
3 篇文章 0 订阅

什么是TOTP(Time-base One-Time Password)?

Time-base One-Time Password翻译过来是基于时间的一次性密码。这里以QQ令牌为例,解释下TOTP。

  • 首先,当用户首次使用QQ令牌时,服务器会向用户的手机APP上颁发一个证书/秘钥(这里理解为一个长的字符串,设为变量:secret,颁发时间[unix时间戳]记为:createTimestamp),单个临时密码的有效期为30s。
  • 手机APP生成临时密码,记当前手机unix时间戳为:appCurrTimestamp,生成规则为:
//当前步数,30秒为一步
var userId = xx;
var step = (appCurrTimestamp - createTimestamp)/(30*1000);
//生成一个六位密码(这里生成密码的方法大家自己定义,保证安全性就行,核心逻辑是上一步计算步数,保证相同步数生成的密码相同即可)
var tempPass = substr(sha256(userId + secret + step),6);
  • 手机APP将密码发送到服务端验证,记服务端当前时间为:serverCurrTimestamp
//当前用户ID
var currUserId = xx;
//根据当前用户ID查询用户秘钥
var currUserSecret = querySecretByUserId(currUserId);
var step = (serverCurrTimestamp - createTimestamp)/(30*1000);
//生成密码(这里生成密码的方法大家自己定义,保证安全性就行,核心逻辑是上一步计算步数,保证相同步数生成的密码相同)
var serverTempPass =  substr(sha256(currUserId + currUserSecret + step),6);
  • 最后验证手机端的生成的临时密码和server端生成的是否相同即可。

边界情况如何处理?

服务器和手机的时间可能存在时间差(还有网络延迟造成的时间差),为了弥补时间差造成的步数不一致的问题,一般会向前和向后多算一步,只要这三步有一步是符合条件的,则符合条件。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值