Have I been pwned?

Derzeit sorgt der Leak von “Collection #1” für aufsehen. Hier wurden etwa 773 Millionen E-Mail Adressen und 21 Millionen Passwörter geleaked.

Diese Liste wurde nun von Troy Hunt in seinen Service have I been pwned? integriert, wodurch er eine beachtliche Liste von 8,4 Milliarden E-Mail Adressen und 551 Million Passwörter anbietet.

Auf der Seite lässt sich zunächst ausprobieren, ob seine E-Mail Adresse in einem Leak auftaucht. Man kann aber auch sein Passwort prüfen lassen. ABER Achtung, wer sein Passwort auf einer anderen Seite eingibt, als die, für die es vorgesehen wurde, hat es grade kompromitiert.

Aber zum Glück bietet die Seite auch eine API zur Prüfung der Mailadressen und Passwörter.

Das ganze funktioniert so, dass man aus seinem Passwort einen sha1 Hash bacht und nur die ersten fünf Zeichen des Hash an den Dienst sendet und eine Liste aller gehashten Passwörter mit den gleichen ersten fünf Zeichen bekommt. Diese lässt sich dann mit dem Hash des eigenen Passworts vergleichen. Sollte es einen Treffer geben, wurde das eigene Passwort geleaked.

So bekommt der Dienst maximal die ersten fünf Zeichen eures gehashten Passworts und sonst nichts.

Ich hab da mal ein paar Zeilen Python Code zusammengehackt, der genau diese Prüfung durchführt.

Viel Spaß damit und hoffentlich sind eure Passwörter sicher.

# Have I Been Pwned Password Check

import hashlib
import requests
import getpass

def hibp(password):
    pwHashed = hashlib.sha1(password)
    hash = pwHashed.hexdigest().upper()
    hashshort = hash[0:5]
    
    req = requests.get("https://api.pwnedpasswords.com/range/"+hashshort)
    answer = req.text.split('\n')
    
    for line in answer:
        hashline = (hashshort+line).split(":")[0]
        if hashline == hash:
            return True
    return False

pw = getpass.getpass(prompt="Type the password to check: ", stream=None).encode("UTF8")
pwned= hibp(pw)

if pwned:
    print("the password you use has been leaked!")
else:
    print("no password leak found")