我一直在尝试将OtpSharp和Google Authenticator一起用于正在开发的应用程序中。但是,我不明白为什么OtpSharp生成的代码与Google Authenticator的代码不匹配。我什至试图根据我的本地操作系统更正输入OtpSharp的时间,但是没有任何运气。另一个需要注意的是,来自python的pyotp库可以很好地工作而无需付出任何特殊的努力。 这是我正在使用的代码:
var bSharedKey = System.Text.Encoding.Unicode.GetBytes("TESTTESTTESTTEST");
//var correction = new TimeCorrection(DateTime.UtcNow.ToLocalTime());
//var totp = new Totp(bSharedKey, timeCorrection: correction);
var totp = new Totp(bSharedKey);
var realOtp = totp.ComputeTotp();
long timestep = 0;
var OTPmatch = totp.VerifyTotp(passwords[1], out timestep);
答案 0 :(得分:1)
问题在于,除了向pyotp库(以及Google Authenticator)提供任意unicode密钥外,还需要输入Base32字符串作为输入,我假设该字符串随后被解码为字节数组,并由库。
因此,我为OtpSharp提供了任意unicode字符串的字节字符串表示形式,并使用一个在线网站将unicode字符串解码为base32字符串,并在Google Authenticator中使用了base32字符串。
简单地说,Otpsharp需要一个字节数组来初始化totp对象,而pyotp需要您为其提供一个base32字符串。
答案 1 :(得分:1)
我使用以下解决方案:
第一
选择一个秘密密钥。
例如:32个字符
private const string SecretKey = "hfBhdVsbAWXmkdWrcnwezQqVLubqeRdq";
第二
使用一种方法来秘密生成QR码。
例如:
https://stefansundin.github.io/2fa-qr/
How to generate a QR Code for Google Authenticator that correctly shows Issuer displayed above the OTP?
点密钥:您必须将密钥转换为Base32才能生成QR码。
您可以使用https://emn178.github.io/online-tools/base32_encode.html在线将字符串转换为base32
第三
安装OtpSharp
nuget软件包。
验证输入的令牌,如下所示:
XXX:有效期限(秒)
private static bool Validate(string token)
{
var totp = new Totp(Encoding.UTF8.GetBytes(SecretKey));
return totp.VerifyTotp(DateTime.UtcNow.AddSeconds(XXX), token, out _, new VerificationWindow(2, 2));
}