【问题标题】:OTP code generation and validation with otp.net使用 otp.net 生成和验证 OTP 代码
【发布时间】:2020-03-21 21:24:45
【问题描述】:

我正在使用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);

        } 

【问题讨论】:

  • 您的代码运行良好。也许您误解了 300 秒的有效期是什么意思。这是最大的时间范围。如果您在该帧的末尾ComputeTotp,您的result 可能会在一秒钟内过期。为了克服这个问题,您可以设置 window 参数 (var window = new VerificationWindow(previous:1, future:1);)。

标签: c# two-factor-authentication one-time-password totp


【解决方案1】:

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

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

在某些情况下,这根本是不可能的。也许你是 编写一个应用程序来生成代码以供时间为 显着关闭。您无法控制服务器的错误时间。 您可以将系统时钟设置为匹配,但您的时间将是 显着关闭,这不是预期的结果。有一堂课 称为 TimeCorrection 可以帮助解决这些情况。

时间校正对象创建可用于校正的偏移量 (至少为了这个计算的目的)相对于 不正确的系统时间。 创建如下

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

创建此实例后,它可以长期使用 总是会使用当前系统时间作为基础来应用 修正系数。该对象是线程安全的,因此可以由 多个线程或网络请求同时进行。

有一个过载需要正确的时间和 参考时间也可以使用。这可以在 UTC 的情况下使用 没有使用时间。

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

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

【讨论】:

    【解决方案2】:

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

    您可以使用此页面生成二维码进行测试2FA QR Code Generator

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

    这些应用忽略

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-22
      • 1970-01-01
      • 2015-10-05
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多