如何计算 TOTP 到期的秒数?
Posted
技术标签:
【中文标题】如何计算 TOTP 到期的秒数?【英文标题】:How to calculate the number of seconds when a TOTP will expire in? 【发布时间】:2018-04-20 00:46:16 【问题描述】:我正在使用notp
在我的节点应用程序中生成一个简单的令牌:
var notp = require('notp')
notp.totp.gen("ciao", ) // => 345678
我想构建一个类似于 Google Authenticator 提供的可视化,并且我需要知道生成的 otp 将过期的秒数(或日期时间)。
我该怎么做?
【问题讨论】:
【参考方案1】:我找到了怎么做,其实很简单,你只需要知道算法使用的开始时间。
事实证明,Google Authenticator 使用 Unix Epoch,所以在我的例子中,显示我可以做的计时器:
setInterval(() => (console.log(30 - Math.round(new Date() / 1000) % 30)), 1000)
【讨论】:
【参考方案2】:这个应该很简单,
Google Authenticator 应用程序和服务器上的代码将从每分钟开始每 30 秒刷新一次新代码。
在这里证明:https://github.com/google/google-authenticator/blob/bd50d15c348a978c314d2b30e586fbc562096223/mobile/blackberry/src/com/google/authenticator/blackberry/AuthenticatorScreen.java#L53
因此,只要您的服务器和应用程序同步,这 30 秒的时间间隔将始终与它们总是从一分钟开始和 1 分 30 秒开始。
另一个需要考虑的因素是,服务器端的 Google Authenticator 可以设置为允许代码仅在 30 秒或 4 分钟内有效。因此,您需要检查您的服务器是否设置为 30 秒或 4 分钟,然后进行相应的编码。
设置时的示例:
默认情况下,令牌的有效期为 30 秒,并且为了补偿 对于客户端和服务器之间可能的时间偏差,我们允许 当前时间之前和之后的额外令牌。如果你经历 时间同步不好的问题,可以加大窗口 从其默认大小 1:30 分钟到大约 4 分钟。你想这样做吗 (是/否)
【讨论】:
不,我发现它是从纪元开始的,(这里你可以看到en.wikipedia.org/wiki/Google_Authenticator)。所以我找到了简单的方法......我稍后会发布答案!无论如何,谢谢! 您的回答与我的建议有何不同?很高兴你想通了以上是关于如何计算 TOTP 到期的秒数?的主要内容,如果未能解决你的问题,请参考以下文章