2

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

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

我想构建一个类似于 Google Authenticator 提供的可视化,并且我需要知道生成的 otp 将过期的秒数(或日期时间)。

我该怎么做?

4

2 回答 2

5

我找到了怎么做,其实很简单,你只需要知道算法使用的开始时间。

事实证明,Google Authenticator 使用 Unix Epoch,所以在我的例子中,显示我可以做的计时器:

setInterval(() => (console.log(30 - Math.round(new Date() / 1000) % 30)), 1000)
于 2017-11-08T12:39:22.360 回答
1

这应该很简单,

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 分钟。你想这样做吗(是/否)

于 2017-11-08T03:00:02.740 回答