我们在iOS上使用Google身份验证器时遇到了问题。我们使用以下标准代码片段来生成 TOTP 密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
keyGen.init(keySize);
byte[] byteKey = keyGen.generateKey().getEncoded();
Base32 base32 = new Base32();
return base32.encodeAsString(byteKey);
生成的代码在末尾用尾随 = 符号填充,如下所示。
6ICU5K45MHIZCMTR3DABCDFP7XSZGV4DVTRABCOPD5RDQRGOLTGQ====
然后,我们根据此字符串生成适当的QR码,但是在某些设备上扫描时会遇到问题。此代码适用于Android上的Google身份验证器,但在使用iOS版本时失败,并出现以下错误...
无效的条形码
条形码"otpauth://totp/MyDomain:user@user.com?secret=6ICU5K45MHIZCMTR3DABCDFP7XSZGV4DVTRABCOPD5RDQRGOLTGQ%3D%3D%3D%3D&issuer=MyDomain"不是有效的身份验证令牌条形码。
如您所见,尾随 = 填充编码在秘密字符串中,这似乎会导致 iOS 上的错误。不知道为什么这在iOS上失败,但在Android上却没有,但这是我们需要添加的东西
这是 GA GitHub 上的一个旧问题,它似乎是相同的问题,但没有解决方案...... https://github.com/google/google-authenticator/issues/267
这里有人在编码之前通过播种字符串来解决这个问题,但这在上面的场景中不起作用 苹果设备上的谷歌身份验证器,某些秘密无效
关于为什么或解决问题的可能方法的任何想法?
以防万一其他人遇到这个问题,我猜他们会因为问题出在 iOS 谷歌身份验证器上,我通过字符串将尾随 = 字符替换为基数 32 个可编码字符来解决这个问题
根据 Google 身份验证器 存储库 (https://github.com/google/google-authenticator/wiki/Key-Uri-Format#algorithm),填充(即 = 符号)应从secret
参数中省略。
必需:机密参数是根据 RFC 3548 在 Base32 中编码的任意键值。RFC 3548 第 2.2 节中指定的填充不是必需的,应省略。