我们已使用Google身份验证器将两因素身份验证整合到我们的一个应用程序中。在质量检查中,出现了一些很奇怪的东西。虽然我设法修复了该问题,但我不确定该修复为什么起作用。
对于我们的共享 secret ,我们在用户开始进行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/RFC 4226的最低 secret 要求(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);
关于这为什么可行,我有两种疯狂的理论:
我讨厌修复错误,并且不知道为什么修复有效。谁能解释一下? 也欢迎有关此主题的其他阴谋论。
最佳答案
我遇到了与上述相同的问题。事实证明,Google Authenticator不喜欢iPhone应用程序中的=符号,但在Android中不提示。
以我为例,在将编码为base32之前,字符串的长度从8个字符增加到10个字符。这将删除字符串末尾的三个===。我在网上发现了为什么=符号出现在base32编码的字符串中:
The pad character (=) does not have a binary representation in BASE32; it is inserted into the BASE32 text as a placeholder to maintain 40-bit alignment
在上面的情况下,添加盐时也会发生同样的情况。您粘贴的第二个 secret 末尾没有=。
希望对您有所帮助。