Für unser gemeinsames Geheimnis haben wir eine GUID zugewiesen dem Benutzer, wenn er mit der TFA-Einrichtung beginnt. Die GUID wird Base-32-kodiert und in die URL eingefügt, die in einen QR-Code umgewandelt und vom Benutzer mit seinem Telefon gescannt wird:
otpauth://totp/myapp_user?secret=g5swmnddhbtggllbgi3dsljumi3tallbmuytgljtg5sdgnbxmy2dgyjwmy======
Und alles funktioniert gut auf allen Nicht-iOS-Geräten, die wir ausprobiert haben. Allein unter iOS wird beim Versuch, den Barcode zu scannen, meistens ein wirklich seltsamer Fehler ausgegeben:
Invalid barcode
The barcode '[same as above]' is not a valid authentication token barcode.
Es erfüllt die Mindestgeheimnisanforderung von Google/RFC 4226 (128 Bit), ist ordnungsgemäß Base32-codiert usw. Warum schlägt es fehl? Der typische Grund für diese Meldung sind Leerzeichen in der URL – aber es gibt keine.
Wenn ich am Anfang der Guid einen kleinen Startwert hinzufüge, funktioniert alles einwandfrei:
otpauth://totp/myapp_user?secret=nfygq33omvzxky3lom3ggmzyha2tgnjnmu4gezbngqzdgyrnhbtdqzrnmeywimrwmjsgknzymi3a
Im Wesentlichen ist es der Unterschied zwischen:
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);
Ich habe zwei verrückte Theorien, warum das möglicherweise funktioniert haben könnte:
- < li>Der iOS-Port erfordert mehr als 128 Bit. Mein Kommentar/Seed reicht aus, um diese Grenze zu überschreiten, was auch immer das sein mag ... außer dass ich ihm tatsächlich mehr als 128 Bit gegeben habe, da es eine Guid-as-String war.
- Nach der Base32-Dekodierung erkennt die iOS-App die geheime Zeichenfolge als Guid und macht etwas anderes damit.