Apple设备上的Google身份validation器,某些机密无效

我们已使用Google身份validation器将两个因素身份validation合并到我们的某个应用程序中。 在QA中,出现了一些非常奇怪的事情。 虽然我设法修复它,但我不确定为什么修复工作。

对于我们的共享密钥,我们在开始TFA设置时为用户分配了GUID。 GUID以base-32编码,并放入转换为QR码的URL中,并由用户使用手机扫描:

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的最低机密要求(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应用程序将秘密字符串识别为guid并对其执行其他操作。

我讨厌修复一个错误,不知道为什么修复工作。 有谁能解释一下? 关于这一主题的其他阴谋理论也受到欢迎。

我遇到了与上述相同的问题。 事实certificate,Google身份validation器不喜欢iPhone应用程序中的=标志,但不会在Android中抱怨。

在我的情况下,我在编码之前将字符串的长度增加到base32,从8个字符增加到10个字符。 这删除了字符串末尾的三个===。 我在网上找到了为什么=符号出现在base32编码的字符串中:

填充字符(=)在BASE32中没有二进制表示; 它作为占位符插入到BASE32文本中以保持40位对齐

在您的情况下,当您添加盐时,同样的情况发生了。 你粘贴的第二个秘密最后没有。

希望这有帮助。

重要的不仅仅是关键的长度

以下是示例URI的外观:otpauth:// totp /示例:alice@google.com?secret = JBSWY3DPEHPK3PXP&issuer =示例

在您的情况下,URI中没有“issuer”或“accountname”,两者都是推荐的 。

PS。 仅供参考,Google Authenticatior也不支持非常长的密钥。

Interesting Posts