Ich versuche, Einmalkennwörter zu verwenden, die mit der Google Authenticator-Anwendung generiert werden können .
Was macht Google Authenticator?
Grundsätzlich implementiert Google Authenticator zwei Arten von Kennwörtern:
- HOTP - HMAC-basiertes Einmalpasswort, dh das Passwort wird bei jedem Anruf gemäß RFC4226 und geändert
- TOTP - Zeitbasiertes Einmalpasswort, das sich alle 30 Sekunden ändert (soweit ich weiß).
Google Authenticator ist hier auch als Open Source verfügbar: code.google.com/p/google-authenticator
Aktueller Code
Ich suchte nach vorhandenen Lösungen, um HOTP- und TOTP-Passwörter zu generieren, fand aber nicht viel. Der Code, den ich habe, ist das folgende Snippet, das für die Generierung von HOTP verantwortlich ist:
import hmac, base64, struct, hashlib, time
def get_token(secret, digest_mode=hashlib.sha1, intervals_no=None):
if intervals_no == None:
intervals_no = int(time.time()) // 30
key = base64.b32decode(secret)
msg = struct.pack(">Q", intervals_no)
h = hmac.new(key, msg, digest_mode).digest()
o = ord(h[19]) & 15
h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
return h
Das Problem, mit dem ich konfrontiert bin, ist, dass das Passwort, das ich mit dem obigen Code generiere, nicht mit dem übereinstimmt, das mit der Google Authenticator-App für Android generiert wurde. Obwohl ich mehrere intervals_no
Werte ausprobiert habe (genau die ersten 10000, beginnend mit intervals_no = 0
), wobei secret
sie dem in der GA-App bereitgestellten Schlüssel entsprechen.
Fragen, die ich habe
Meine Fragen sind:
- Was mache ich falsch?
- Wie kann ich HOTP und / oder TOTP in Python generieren?
- Gibt es dafür Python-Bibliotheken?
Zusammenfassend: Geben Sie mir alle Hinweise, die mir bei der Implementierung der Google Authenticator-Authentifizierung in meinem Python-Code helfen.