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

Posted

技术标签:

【中文标题】使用 otp.net 生成和验证 OTP 代码【英文标题】:OTP code generation and validation with otp.net 【发布时间】: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);)。 【参考方案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 中指定的参数。

【讨论】:

以上是关于使用 otp.net 生成和验证 OTP 代码的主要内容,如果未能解决你的问题,请参考以下文章

节点中的 OTP 验证

如何验证用户从数据库中的浏览器输入的otp?

如何使用 Firebase android 验证收到的用于手机号码验证的 OTP

获取 Firebase 电话身份验证 OTP 时出错

使用 Firebase 和 Flutter 通过 OTP 验证电话号码

浏览器中的自动增量验证短信代码 (otp || 2fa)