什么是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
版权归原作者 胡子哥_ 所有, 如有侵权,请联系我们删除。
版权归原作者 胡子哥_ 所有, 如有侵权,请联系我们删除。