如何计算TOTP到期时的秒数?

时间:2017-11-07 14:56:38

标签: node.js security one-time-password google-authenticator

我使用notp在我的节点应用中生成一个简单的令牌:

var notp = require('notp')
notp.totp.gen("ciao", {}) // => 345678

我想构建一个类似于Google身份验证器提供的可视化,我需要知道生成的otp到期时的秒数(或日期时间)。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

这应该很简单,

Google身份验证器应用程序和服务器上的代码将在每分钟30秒开始刷新一个新代码。

此处的证明:https://github.com/google/google-authenticator/blob/bd50d15c348a978c314d2b30e586fbc562096223/mobile/blackberry/src/com/google/authenticator/blackberry/AuthenticatorScreen.java#L53

因此,只要您的服务器和应用程序同步,这30秒间隔将始终与它们始终在分钟开始时以及1分30秒处开始相同。

要考虑的另一个因素是服务器端的Google身份验证器可以设置为允许代码仅30秒或4分钟有效。因此,您需要检查服务器是在30秒还是4分钟设置,然后进行相应的编码。

设置时的示例:

  

默认情况下,令牌有效期为30秒,以便进行补偿   对于客户端和服务器之间可能存在的时间偏差,我们允许   当前时间之前和之后的额外令牌。如果你经历过   时间同步不好的问题,可以增加窗口   从默认大小1:30min到大约4min。你想这样做吗?   (Y / N)

答案 1 :(得分:0)

我发现它是如何做到的,它实际上很简单,你只需要知道算法使用的开始时间。

事实证明,Google身份验证器使用Unix Epoch,所以在我的情况下,要显示我可以做的计时器:

setInterval(() => (console.log(30 - Math.round(new Date() / 1000) % 30)), 1000)