Cli*_*rce 6 c# authentication ios
我们已使用Google身份验证器将两个因素身份验证合并到我们的某个应用程序中.在质量保证方面,出现了一些非常奇怪的事情.虽然我设法修复它,但我不确定为什么修复工作.
对于我们的共享密钥,我们在开始TFA设置时为用户分配了GUID.GUID获得base-32编码,并放入转换为QR码的URL,并由用户使用手机扫描:
otpauth://totp/myapp_user?secret=g5swmnddhbtggllbgi3dsljumi3tallbmuytgljtg5sdgnbxmy2dgyjwmy======
Run Code Online (Sandbox Code Playgroud)
一切都适用于我们尝试过的所有非ios机器.仅在ios上,在大多数情况下尝试扫描条形码时会抛出一个非常奇怪的错误:
Invalid barcode
The barcode '[same as above]' is not a valid authentication token barcode.
Run Code Online (Sandbox Code Playgroud)
它符合Google/RFC 4226的最低机密要求(128位),正确进行Base32编码等等......为什么会失败?这条消息的典型原因是网址中有空格 - 但没有.
如果我在guid的开头添加一个小种子,一切正常:
otpauth://totp/myapp_user?secret=nfygq33omvzxky3lom3ggmzyha2tgnjnmu4gezbngqzdgyrnhbtdqzrnmeywimrwmjsgknzymi3a
Run Code Online (Sandbox Code Playgroud)
基本上它是以下之间的区别:
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);
Run Code Online (Sandbox Code Playgroud)
我有两个疯狂的理论,为什么这可能有效:
ios端口需要128位以上.无论发生什么事情,我的评论/种子足以超过这个限制......除了我实际上给它超过128位,因为它是一个guid-as-string.
在Base32解码之后,ios应用程序将秘密字符串识别为guid并对其执行其他操作.
我讨厌修复一个bug而不知道为什么修复工作.有谁能解释一下? 关于这一主题的其他阴谋理论也受到欢迎.
我遇到了与上述相同的问题.事实证明,Google身份验证器不喜欢iPhone应用程序中的=标志,但不会在Android中抱怨.
在我的情况下,我在编码之前将字符串的长度增加到base32,从8个字符增加到10个字符.这删除了字符串末尾的三个===.我在网上找到了为什么=符号出现在base32编码的字符串中:
填充字符(=)在BASE32中没有二进制表示形式; 它作为占位符插入到BASE32文本中以保持40位对齐
在您的情况下,当您添加盐时,同样的情况发生了.你粘贴的第二个秘密最后没有.
希望这有帮助.
5年后...我们只能让Google Authenticator接受16位数字长的密钥。较短和较长的密钥只会失败,并显示“条形码无效。条形码......不是有效的身份验证令牌条形码。” 浪费了很多时间来解决这个问题,希望能有所帮助。
| 归档时间: |
|
| 查看次数: |
2465 次 |
| 最近记录: |