如何计算 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 到期的秒数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在中断程序之前计算一定的秒数[重复]

如何计算两个日期之间的秒数?

有没有办法计算自启动以来的秒数?

iOS开发:计算两个事件之间经过的秒数的简单方法是啥?

从开始时间和经过的秒数计算日期时间

java怎样计算两个日期之间的秒数