gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 03:51:40 33 4
gpt4 key购买 nike

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

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com