Python-Schnippsel um Passwortleaks zu durchsuchen

Immer wieder tauchen geklaute Dumps von Online-Diensten mit genutzten Passworten der Nutzer auf - diese Passworte werden weiter genutzt um andere Dienste zu testen und sollten nicht mehr genutzt werden.

Um zu testen ob ein selbst genutztes Passwort betroffen ist gibt es inzwischen zahlreiche Dienste, beispielsweise bei haveibeenpwned.

Wer (s)ein Passwort nicht einfach so auf einer Webseite eingeben mag kann auch programmatisch testen ob es betroffen ist. Hier dazu ein kleines Python-Skript. Ich habe absichtlich keine "fortgeschrittenen" Python-Features genutzt, damit es (hoffentlich) leicht verständlich ist. Zum ausführen braucht es neben Python noch das Modul requests.

import getpass
import hashlib
import requests
import sys

# Passwort interaktiv abfragen und SHA1-Hash errechnen.
# getpass sorgt dafür dass die Eingabe auf dem Terminal nicht
# angezeigt wird.
pw_sha = hashlib.sha1(
        getpass.getpass("Password please: ").encode('utf-8')
    ).hexdigest().upper()

# Der erste Teil des Hashes wird an den Dienst haveibeenpwned.com
# geschickt. Von diesem lässt sich nicht auf das abgefragte Passwort
# schliessen, eine Erklärung des Dienstes gibt es hier:
# https://haveibeenpwned.com/API/v2#PwnedPasswords
try:
    req = requests.get('https://api.pwnedpasswords.com/range/{}'.format(pw_sha[:5]))
except:
    print("Anfrage an haveibeenpwned schlug fehl.")
    sys.exit(1)
if req.status_code != 200:
    print("Anfrage an haveibeenpwned schlug fehl.")
    sys.exit(1)

# Als Antwort gibt es eine Liste aller in den benutzten Dumps bekannten
# Passwort-Hashes, diese werden jetzt mit dem Rest des eingegebenen Hashes
# verglichen
for match in req.text.split():
    if match.startswith(pw_sha[5:]):
        # Der Passworthash wurde gefunden, das Passwort ist also bekannt.
        print("Passwort {} mal gefunden.".format(match.split(':')[1]))
        sys.exit(0)

# Hier kommt das Skript nur an wenn das Passwort nicht gefunden wurde
print("Dein Passwort taucht in keinem gescannten Dump auf. Das bedeutet nicht zwingend das es sicher ist!")

Zum nutzen Copy-Paste von hier, oder das Skript herunterladen (auf "Raw Text" klicken, dann speichern)