我们使用 Google Authenticator 将双因素身份验证整合到我们的一个应用程序中。在 QA 中,出现了一些非常奇怪的事情。虽然我设法修复了它,但我不太确定为什么修复有效。
对于我们的共享 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);
关于为什么这可能有效,我有两个疯狂的理论:
ios端口需要128位以上。我的评论/种子足以使其超过该限制,无论发生什么......除了我实际上给了它超过 128 位,因为它是一个 guid-as-string。
Base32 解码后,ios 应用程序将 secret 字符串识别为 guid,并对其执行其他操作。
我讨厌修复一个 bug 而不知道修复的原因。谁能解释一下?也欢迎提出关于此主题的其他阴谋论。
最佳答案
我遇到了和上面一样的问题。事实证明,Google Authenticator 在 iPhone 应用程序中不喜欢 = 标志,但在 Android 中不会提示。
在我的例子中,我将编码为 base32 之前的字符串长度从 8 个字符增加到 10 个字符。这删除了字符串末尾的三个 === 。我在网上找到了为什么 = 符号出现在 base32 编码的字符串中:
在您上面的例子中,当您添加盐时会发生同样的情况。您粘贴的第二个 secret 末尾没有 =。
希望这对您有所帮助。
关于c# - Apple 设备上的 Google 身份验证器,某些 secret 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29173288/