首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于otp.net的OTP代码生成与验证

基于otp.net的OTP代码生成与验证
EN

Stack Overflow用户
提问于 2019-11-26 12:44:53
回答 3查看 10.1K关注 0票数 5

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

完整代码

代码语言:javascript
复制
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);

        } 
EN

回答 3

Stack Overflow用户

发布于 2021-12-11 07:08:25

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

在理想的世界中,客户端和服务器的系统时间与NIST或其他权威时间标准的第二个是正确的。这将确保生成的代码始终正确。如果可能的话,尽可能将系统时间与NIST同步。 在有些情况下,这是不可能的。也许您正在编写一个应用程序来生成代码,以便与时间非常短的服务器一起使用。无法控制服务器的错误时间。您可以设置您的系统时钟匹配,但您的时间将显着地关闭,这不是想要的结果。有一个名为TimeCorrection的类可以帮助处理这些情况。 时间校正对象创建一个偏移量,该偏移量可用于更正相对于不正确的系统时间的时间(至少在此计算中是如此)。它按以下方式创建 var correction = new TimeCorrection(correctTime);,其中正确的时间参数是表示当前正确时间(至少为了验证目的)的DateTime对象。为此,需要有某种方法来获取当前可接受时间的实例。这可以通过NTP (NTP和NIST即将在这个库中出现)来完成,或者从HTTP请求或其他方式寻找日期响应头。 一旦创建了该实例,就可以使用它很长时间,因为它总是使用当前系统时间作为基础来应用校正因子。对象是threadsafe,因此可以由多个线程或web请求同时使用。 有一个过载,它同时占用正确的时间和引用时间来使用。这可以在不使用UTC时间的情况下使用。 Totp类构造函数可以接受一个TimeCorrection对象,该对象将应用于所有时间的计算和验证。 var totp = new Totp(secretKey, timeCorrection: correction);

票数 0
EN

Stack Overflow用户

发布于 2021-12-11 08:09:36

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

您可以生成QR代码,以便使用此页2FA QR码发生器进行测试。

如果您使用Google身份验证器、Microsoft身份验证器、Twilio Authy作为生成代码。当您用TOTP Uri捕获QR代码时。

这些应用程序忽略了

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

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

票数 0
EN

Stack Overflow用户

发布于 2022-12-01 07:53:41

代码语言:javascript
复制
string[]    arr      =   {  "1", "2", "3", "4", "5", "6", "7", "8", "9", "0"  };
string      IDString =    "";
string      temp;
Random      rand      = new Random();
for (int i = 0; i < 4; i++) 
    {
          temp        = arr[rand.Next(0, arr.Length)];
          IDString   += temp;
          NewPassword = IDString;
    }
Console.WriteLine("OTP=" + NewPassword);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59051270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档