0


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

什么是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
//当前用户IDvar currUserId = xx;//根据当前用户ID查询用户秘钥var currUserSecret =querySecretByUserId(currUserId);var step =(serverCurrTimestamp - createTimestamp)/(30*1000);//生成密码(这里生成密码的方法大家自己定义,保证安全性就行,核心逻辑是上一步计算步数,保证相同步数生成的密码相同)var serverTempPass =substr(sha256(currUserId + currUserSecret + step),6);
  • 最后验证手机端的生成的临时密码和server端生成的是否相同即可。

边界情况如何处理?

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


本文转载自: https://blog.csdn.net/weixin_43002640/article/details/127527560
版权归原作者 胡子哥_ 所有, 如有侵权,请联系我们删除。

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

还没有评论