Google Authenticator-Code stimmt nicht mit dem vom Server generierten Code überein.

Hintergrun

Ich arbeite derzeit an einem Zwei-Faktor-Authentifizierungssystem, bei dem Benutzer sich mit ihrem Smartphone authentifizieren können. Bevor der Benutzer sein Gerät verwenden kann, muss es zuerst überprüft werden. Dazu müssen sie einen QR-Code scannen, den ich ihnen gebe, und den Code eingeben, der anschließend angezeigt wird.

Proble

Das Scannen des QR-Codes funktioniert einwandfrei und wird von der Google Authenticator-App korrekt gelesen. Die generierten Codes stimmen jedoch nicht mit denen überein, die ich auf dem Server generiere.

Was habe ich versucht

Ich habe ein paar Dinge ausprobiert, um mein Problem zu finden.

Ich habe versucht, beide Standardgeheimnisse direkt einzufügen:'thiswasmysecretkeyused' und einbase64.b32encode() codierte Version des Geheimnisses:'ORUGS43XMFZW26LTMVRXEZLUNNSXS5LTMVSA====' in der Google Authenticator-App, aber beide generierten andere Codes als der Server.

Ich habe gelesen, dass das nachgestellte==== von der Taste kann dazu führen, dass es nicht funktioniert, also habe ich versucht, auch eine ohne diese hinzuzufügen. Immer noch keine guten Ergebnisse (sie erzeugen die gleichen Codes)

Ich habe versucht, einen anderen Algorithmus zum Generieren von TOTP-Codes zu verwenden, für den unwahrscheinlichen Fall, dass der von mir verwendete Algorithmus django-otp) ist falsch. Der andere von mir verwendete Algorithmus stammt vonDie Antworten. Beide Algorithmen haben bei Verwendung desselben Schlüssels dieselben Codes generiert.

Ich habe die Uhrzeit auf meinem System überprüft. Ich sah, dass das Betriebssystem @ zeig15:03 genau wie mein smartphone war. Nach dem Dumpen der Zeit in Python mit beidentime.time() unddatetime.datetime.now() Ich habe festgestellt, dass die zurückgegebene Zeit eine Stunde hinter der Betriebssystemzeit liegt. zeigt14:03. Ich habe versucht, @ hinzuzufüg3600 Sekunden bis zum für die Codegenerierung verwendeten Zeitstempel, jedoch ohne Erfolg.

Ich habe verschiedene andere Dinge ausprobiert, kann mich aber nicht genau erinnern, was sie alle waren.

Ich habe den Code, der Schlüssel in Google Authenticator akzeptiert, nachgeschlagen und festgestellt, dass eine Base32-Zeichenfolge erwartet wird. So ist meine Kodierung des Schlüssels meines Wissens korrekt. Aus dem Code EnterKeyActivity.java, Zeile 78):

Verifizieren Sie, dass das Eingabefeld eine gültige base32-Zeichenfolge enthält

Cod

Generierung des geheimen Schlüssels;

def generate_shared_key(self):
    # create hash etc.
    return base64.b32encode(hasher.hexdigest())

Generierung des QR-Codes;

key = authenticator.generate_shared_key()
qrcode = pyqrcode.create('otpauth://totp/someurl.nl?secret=' + key)

Generierung des TOTP-Codes;

def generate_code(self, drift_steps=0, creation_interval=30, digits=6, t0=0):
    code = str(totp(self.generate_shared_key(), creation_interval, timestamp, digits, drift_steps))
    return code.zfill(digits)

Wenn Sie mehr Code benötigen, z. B. Django-Otp, der den eigentlichen Totp-Code generiert, lassen Sie es mich wissen.

Errors

Keine Fehler

Hunches

Meine Vermutung ist, dass ich irgendwo mit der Schlüsselgenerierung oder der Übergabe des Schlüssels an Google Authenticator falsch liegen muss. Da selbst das manuelle Einfügen des Schlüssels in Google Authenticator nicht die richtigen Codes generiert. Kann Google Authenticator nach dem Speichern des Schlüssels noch weitere Aktionen ausführen, z. B. das Hinzufügen eines Nutzers?

Ich habe auch in dem anderen Algorithmus bemerkt, dass das Geheimnis dort zuerst mit entschlüsselt wird;

key = base64.b32decode(secret, True) 

Ist mein Originalschlüssel (ein SHA512-Hash) falsch? Soll ich oder soll ich es nicht mit @ kodierbase64.b32encode()? Wenn ich versuche, den generierten QR-Code zu scannen, ohne den Hash zu codieren, erkennt Google Authenticator ihn nicht als (gültigen) Schlüssel.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage