我使用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);
} 发布于 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);
发布于 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代码时。
这些应用程序忽略了
只要您使用相同的库来验证otp代码,您的代码就可以了。如果使用代码生成应用程序(Google身份验证程序、Microsoft身份验证程序、Authy应用程序),则验证将不正确,因为它们使用默认值并忽略TOTP Uri中指定的参数。
发布于 2022-12-01 07:53:41
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);https://stackoverflow.com/questions/59051270
复制相似问题