Google Authenticator auf Apple-Geräten, bestimmte Geheimnisse sind ungültig
Posted: 21 Dec 2024, 01:33
Wir haben die Zwei-Faktor-Authentifizierung mithilfe von Google Authenticator in eine unserer Anwendungen integriert. Bei der Qualitätssicherung ist etwas wirklich Seltsames aufgetaucht. Obwohl es mir gelungen ist, das Problem zu beheben, bin ich mir nicht wirklich sicher, warum das Update funktioniert.
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:
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.