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

边界情况如何处理?

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

你可能感兴趣的:(方案,算法,web,系统安全,安全架构,web安全,算法)