C# 苹果设备上的谷歌认证器,某些机密无效

C# 苹果设备上的谷歌认证器,某些机密无效,c#,ios,authentication,C#,Ios,Authentication,我们已经使用Google Authenticator将双因素身份验证合并到我们的一个应用程序中。在QA中,出现了一些非常奇怪的事情。虽然我设法修复了它,但我不太清楚为什么修复会起作用 对于共享机密,我们在用户开始TFA设置时为其分配了GUID。GUID进行base-32编码,并输入URL,该URL转换为QR码,由用户用手机扫描: otpauth://totp/myapp_user?secret=g5swmnddhbtggllbgi3dsljumi3tallbmuytgljtg5sdgnbxmy

我们已经使用Google Authenticator将双因素身份验证合并到我们的一个应用程序中。在QA中,出现了一些非常奇怪的事情。虽然我设法修复了它,但我不太清楚为什么修复会起作用

对于共享机密,我们在用户开始TFA设置时为其分配了GUID。GUID进行base-32编码,并输入URL,该URL转换为QR码,由用户用手机扫描:

 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);
我有两个疯狂的理论来解释为什么这可能有效:

  • ios端口需要超过128位。我的评论/种子足以让它超越那个极限,不管发生什么。。。除了我实际上给了它超过128位,因为它是作为字符串的guid

  • 在Base32解码后,ios应用程序将该秘密字符串识别为guid,并对其执行其他操作


  • 我讨厌修复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的密钥长度。干杯