c# - Apple 设备上的 Google 身份验证器,某些 secret 无效

标签 c# ios authentication

我们使用 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);

关于为什么这可能有效,我有两个疯狂的理论:

  1. ios端口需要128位以上。我的评论/种子足以使其超过该限制,无论发生什么......除了我实际上给了它超过 128 位,因为它是一个 guid-as-string。

  2. Base32 解码后,ios 应用程序将 secret 字符串识别为 guid,并对其执行其他操作。

我讨厌修复一个 bug 而不知道修复的原因。谁能解释一下?也欢迎提出关于此主题的其他阴谋论。

最佳答案

我遇到了和上面一样的问题。事实证明,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 末尾没有 =。

希望这对您有所帮助。

关于c# - Apple 设备上的 Google 身份验证器,某些 secret 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29173288/

相关文章:

c# - 如何在没有 IIS/WCF 的情况下通过 REST API 调用对 Windows 用户进行身份验证?

c# - 通过 PHP REST api 使用 C# 进行安全身份验证和请求

c# - 在 .Net 2.0 中从 ArrayList 转换为 List 的最佳方法是什么

ios - 坚持一个结构

ios - 运行应用程序甚至用户在 IOS 中杀死应用程序

ios - NaN 会导致这个核心音频 iOS 应用程序偶尔崩溃吗?

android - 将身份验证 header 添加到 Volley 中的 NetworkImageView

C#:如何将包含空值的 guid 类型的数据库字段转换为局部变量?

c# 将 bool 值插入数据库

c# - 没有括号的方法链接,如何?