C# 苹果设备上的谷歌认证器,某些机密无效
我们已经使用Google Authenticator将双因素身份验证合并到我们的一个应用程序中。在QA中,出现了一些非常奇怪的事情。虽然我设法修复了它,但我不太清楚为什么修复会起作用 对于共享机密,我们在用户开始TFA设置时为其分配了GUID。GUID进行base-32编码,并输入URL,该URL转换为QR码,由用户用手机扫描:C# 苹果设备上的谷歌认证器,某些机密无效,c#,ios,authentication,C#,Ios,Authentication,我们已经使用Google Authenticator将双因素身份验证合并到我们的一个应用程序中。在QA中,出现了一些非常奇怪的事情。虽然我设法修复了它,但我不太清楚为什么修复会起作用 对于共享机密,我们在用户开始TFA设置时为其分配了GUID。GUID进行base-32编码,并输入URL,该URL转换为QR码,由用户用手机扫描: otpauth://totp/myapp_user?secret=g5swmnddhbtggllbgi3dsljumi3tallbmuytgljtg5sdgnbxmy
otpauth://totp/myapp_user?secret=g5swmnddhbtggllbgi3dsljumi3tallbmuytgljtg5sdgnbxmy2dgyjwmy======
所有这些都适用于我们尝试过的所有非ios机器。仅在ios上,在大部分时间尝试扫描条形码时,它会抛出一个非常奇怪的错误:
Invalid barcode
The barcode '[same as above]' is not a valid authentication token barcode.
它符合Google/RFC4226的最低保密要求(128位),是正确的Base32编码,等等。。。为什么会失败?出现此消息的典型原因是url中有空格,但没有空格
如果我在guid的开头添加一个小种子,一切都会正常工作:
otpauth://totp/myapp_user?secret=nfygq33omvzxky3lom3ggmzyha2tgnjnmu4gezbngqzdgyrnhbtdqzrnmeywimrwmjsgknzymi3a
本质上,这是以下两者之间的区别:
secret = enc.Encode32(Encoding.ASCII.GetBytes("iphonesucks" + Guid.NewGuid().ToString())); // Works
secret = enc.Encode(Encoding.ASCII.GetBytes(Guid.NewGuid().ToString())); // Fails
newAuthUrl = string.Format("otpauth://totp/myapp_user?secret={0}", secret);
我有两个疯狂的理论来解释为什么这可能有效:
我讨厌修复bug,也不知道为什么修复会起作用。有人能解释这一点吗?关于这个话题的其他阴谋论也很受欢迎。重要的不仅仅是关键长度 以下是示例URI的外观: otpauth://totp/Example:alice@google.com?secret=jbswy3dpehpkp&issuer=Example 在您的例子中,URI中没有“颁发者”或“帐户名”,两者都是
另外,仅供参考,Google Authenticatior也不支持很长的密钥。我遇到了与上面相同的问题。事实证明Google Authenticator不喜欢IPhone应用中的=符号,但在Android中没有抱怨 在我的例子中,在编码到base32之前,我将字符串的长度从8个字符增加到了10个字符。这删除了字符串末尾的三个===。我在网上找到了关于为什么=符号出现在base32编码字符串中的问题: 在你上面的例子中,当你加盐时,同样的情况也发生了。你粘贴的第二个秘密最后没有class='s
希望这能有所帮助。5年后。。。我们只能让Google Authenticator接受长度16位的密钥。短密钥和长密钥会因“无效条形码。条形码…不是有效的身份验证令牌条形码”而失败。为此花费了大量时间进行故障排除,希望能有所帮助。我也有此问题 此链接有效
otpauth://totp/xxx.yyy:usertest009%40xxx.yyy?secret=CC5FCZNWTKNTOVN6&period=30&digits=6&algorithm=SHA1&issuer=xxx.yyy
但使用diff密钥将使其无效
otpauth://totp/xxx.yyy:usertest009%40xxx.yyy?secret=PBUPKS3SLJAP9V2T&period=30&digits=6&algorithm=SHA1&issuer=xxx.yyy
我发现了问题
密钥必须是base32字符串。
我使用NodeJS,所以我使用speakeasy创建秘密字符串base32。它现在可以工作了。今天救了我的命,我疯狂地寻找android和ios客户端之间的差异。干杯,伙计,这很有帮助,谢谢。但在出现此错误之前,我可以使用长达18的密钥长度。干杯