2

我正在使用Otp.NET库来生成和验证 OTP。我想使用 TOTP 算法。生成的 OTP 需要 5 分钟有效。该库建议var totp = new Totp(secretKey, step: 300);用于此目的。但 OTP 在 5 分钟前失效

完整代码

public static void GenarateTOTP()
        {
            var bytes = Base32Encoding.ToBytes("JBSWY3DPEHPK3PXP");

            var totp = new Totp(bytes, step: 300);

            var result = totp.ComputeTotp(DateTime.UtcNow);

            Console.WriteLine(result);

            var input = Console.ReadLine();
            long timeStepMatched;
            bool verify = totp.VerifyTotp(input, out timeStepMatched, window: null);

            Console.WriteLine("{0}-:{1}", "timeStepMatched",timeStepMatched);
            Console.WriteLine("{0}-:{1}", "Remaining seconds", totp.RemainingSeconds());
            Console.WriteLine("{0}-:{1}", "verify", verify);

        } 
4

2 回答 2

0

我测试了你的代码,代码没有问题,生成的otp有效期最长为5分钟。您可以创建一个计时器以进行进一步调查。我认为这部分文件可以帮助你:

在理想情况下,客户端和服务器的系统时间都准确到 NIST 或其他权威时间标准的秒。这将确保生成的代码始终正确。如果可能的话,尽可能与 NIST 同步系统时间。

在某些情况下,这根本是不可能的。也许您正在编写一个应用程序来生成代码,以供时间很短的服务器使用。您无法控制服务器的错误时间。您可以将系统时钟设置为匹配,但您的时间会明显减少,这不是您想要的结果。有一个名为 TimeCorrection 的类可以帮助解决这些情况。

时间校正对象会创建一个偏移量,该偏移量可用于校正(至少出于此计算的目的)相对于不正确系统时间的时间。它创建如下

var correction = new TimeCorrection(correctTime); 其中正确的时间参数是一个 DateTime 对象,它表示当前正确的(至少为了验证目的)UTC 时间。为此,需要某种方法来获取当前可接受时间的实例。这可以通过 NTP 来完成(带有 NIST 的 NTP 即将在这个库中推出)或从 HTTP 请求或其他方式中查找 Date 响应头。

创建此实例后,它可以长期使用,因为它始终使用当前系统时间作为基础来应用校正因子。该对象是线程安全的,因此可以同时被多个线程或 Web 请求使用。

存在需要正确时间和参考时间才能使用的过载。这可以在不使用 UTC 时间的情况下使用。

Totp 类构造函数可以采用 TimeCorrection 对象,该对象将应用于所有时间计算和验证。

var totp = new Totp(secretKey, timeCorrection: correction);

于 2021-12-11T07:08:25.907 回答
0

检查 URI 的格式https://github.com/google/google-authenticator/wiki/Key-Uri-Format

您可以使用此页面生成用于测试的二维码 2FA 二维码生成器

如果您使用 Google Authenticator、Microsoft Authenticator、Twilio Authy 生成代码。当您使用 TOTP Uri 捕获 QR 码时。

这些应用程序忽略

  • 周期参数默认为 30。
  • 算法参数默认为 SHA1。
  • Digits 参数默认为 6。

只要您使用相同的库来验证 otp 代码,您的代码就可以了。如果您使用代码生成应用程序(Google Authenticator、Microsoft Authenticator、Authy)验证将不正确,因为它们使用默认值并忽略 TOTP Uri 中指定的参数。

于 2021-12-11T08:09:36.987 回答