使用 otp.net 生成和验证 OTP 代码

Kus*_*era 9 c# one-time-password two-factor-authentication totp

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

        } 
Run Code Online (Sandbox Code Playgroud)

Moh*_*eri 0

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

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

在某些情况下这是根本不可能的。也许您正在编写一个应用程序来生成代码,以便与时间严重不足的服务器一起使用。你无法控制服务器的错误时间。您可以将系统时钟设置为匹配,但随后您的时间会明显偏离,这不是所需的结果。有一个名为 TimeCorrection 的类可以帮助解决这些情况。

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

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

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

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

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

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