Nach dem Passwort-Leak: Eigene Passwörter lokal checken

Eine halbe Milliarde geleakter Passwörter mal eben lokal durchsuchen? Mit einem Python-Skript geht das schnell und auch ohne riesige Downloads.

In Pocket speichern vorlesen Druckansicht 33 Kommentare lesen
Nach dem Passwort-Leak: Eigene Passwörter lokal checken

(Bild: plantic\Shutterstock.com, Modifikation: heise Security)

Lesezeit: 5 Min.
Von
  • Ronald Eikenberg

Im Netz kursieren Milliarden Zugangsdaten – zuletzt sorgte eine Passwort-Sammung mit 773 Millionen Online-Konten für Aufsehen. Wer überprüfen möchte, ob sich die eigenen Acconts darunter befinden, kann die Web-Dienste Have I Been Pwned (HIBP) oder auch Pwned Passwords nutzen. Bei HIBP durchsucht man eine riesige Datenbank mit rund 6,5 Milliarden geknackten Accounts nach einer Mail-Adresse, bei Pwned Passwords sucht man nach einem Passwort. Beide Dienste betreibt der renommierte Sicherheitsexperte Troy Hunt.

Das Passwort "Mutti" ist nicht besonders originell: Pwned Passwords meldet 181 Suchtreffer.

Gibt man bei Pwned Passwords ein Passwort ein, erfährt man, ob es sich in den dort erfassten Datenbank-Leak befindet – und wenn ja, wie oft. Ein Suchtreffer heißt noch nicht, dass einer der eigenen Accounts tatsächlich betroffen ist. Schließlich kann es sich auch um Accounts anderer Nutzer handeln, die zufällig das gleiche Paswort einsetzen. Gerade bei individuellen Kennwörtern, die aus zufälligen Zeichenfolgen bestehen, ist die Wahrscheinlichkeit jedoch groß, dass es einen selbst erwischt hat. Auf jeden Fall ist sicher, dass das Passwort in den Wörterbüchern der Cracker steht und im Zweifelsfall beim Durchprobieren vieler Passwörter (Brute Forcing) recht schnell geknackt wird.

Nun gilt es als Binsenweisheit, dass es eine schlechte Idee ist, einem Webdienst geheime Passwörter zu verraten, um deren Sicherheit zu überprüfen. Spätestens mit dem Absenden des Passworts ist dieses üblicherweise als verbrannt zu betrachten. Troy Hunt hat sich einen Mechanismus einfallen lassen, um dieses Problem zu entschärfen: Pwned Passwords hasht das eingetippte Passwort lokal im Browser des Nutzers mit SHA-1 und sendet nur die ersten fünf Stellen des Hashes an den Server. Der Server liefert daraufhin eine Liste Passwort-Hashes zurück, die mit diesen fünf Zeichen beginnen.

Eine Suche nach dem Passwort "Mutti" (SHA-1-Hash: 0D926579481433A17E8054ACDA22571772FA0181) etwa führt zu der folgenden Anfrage:

GET https://api.pwnedpasswords.com/range/0D926

Daraufhin liefert der Server die folgende Liste zurück:

00C49CB05CDDCB132767A4760E3A1E977B2:1
00D7927E0C070902CB85534E808C6D55450:11
018BC2A467EB1A122E9736813260D25F0CB:2
0201AF4728C4BE1A66923EA48EAD6DECE2E:1
...
579481433A17E8054ACDA22571772FA0181:181
...

Da die ersten fünf Zeichen der Hashes bekannt sind, spart sich der Server deren Übermittlung. Die Zahl nach dem Doppelpunkt steht für die Anzahl der Suchtreffer in den Leaks; "Mutti" wurde bei unserer Anfrage insgesamt 181 Mal gefunden.

Auch gezippt ist die Liste der Passwort-Hashes noch 11 GByte groß.

Mit dieser Methode erfährt der Server zwar nicht den kompletten Passwort-Hash, jedoch die ersten 5 von insgesamt 40 Zeichen. Würde es einem Angreifer gelingen, diese 5 Zeichen abzufangen, erhält er einen wertvollen Hinweis auf den Passwort-Hash des Nutzers. Man kann dieses Problem umschiffen, indem man die Liste der Hashes herunterlädt und lokal durchsucht – damit handelt man sich allerdings ein neues Problem ein: Die Datei ist selbst gezippt noch 11 GByte groß und eine Suche in einer so großen Datei ist ressourcenaufwendig.

Eine elegante Lösung für dieses Problem liefert der Entwickler Hector Martin in seinem Github-Repository: Er nutzt einen Bloom-Filter, um die Datenmassen effizient durchsuchbar zu machen. Man benötigt lediglich Python 3.x, die Datei bloom.py und eine der beiden Bloom-Filterlisten, die Martin zum Download anbietet.

Bloom-Filter reduzieren die zu durchsuchende Datenmenge ganz enorm, was sich nicht nur positiv auf die Suchgeschwindigkeit auswirkt, sondern auch die Größe der erforderlichen Downloads deutlich verkleinert. Das erkauft man sich mit einer etwa unscharfen Suche, die gelegentlich Fehlalarme (False Postives) produziert. Es kann also passieren, dass bloom.py ein Passwort als verbrannt meldet, das sich gar nicht in der Originalliste befindet. Der umgekehrte Fall – also ein Passwort steht zwar in der Liste, wird aber nicht gefunden (False Negative) – ist prinzipbedingt ausgeschlossen. Das Konzept der Bloom-Filter erklärt Bloom Filters for Dummies recht anschaulich.

Die beiden angebotenen Listen unterscheiden sich in der Genauigkeit: pwned-passwords-2.0.bloom misst 968 MByte und hat eine False-Positive-Rate von 0,0005 während pwned-passwords-2.0-k16.bloom etwa um die Hälfte größer ist und die False-Positive-Rate auf 0,000015 verkleinert. Beide False-Positives-Raten sind durchaus vertretbar – die Wahrscheinlichkeit, dass das Skript fälschlicherweise behauptet, ein Hash würde sich unter den Leaks befinden, ist sehr gering (0,5 bzw. 1/66 Promille). Wer ganz sicher gehen will, kann ja mit dem sehr wahrscheinlich sowieso verbrannten Passwort das HIBP-API befragen. Der Fall, dass ein betroffener Hash nicht gemeldet wird, ist hingegen ausgeschlossen. Die Download-Links zu den beiden Bloom-Filtern findet man im Readme-Bereich des Skripts.

Man ruft das Skript wie folgt auf:

python bloom.py test -s pwned-passwords-2.0.bloom MeinPasswort

Auf diese Weise kann man ressourcensparend herausfinden, ob bestimmte Passwörter in einschlägigen Quellen kursieren – ohne einen Teil des Passwort-Hashs verraten zu müssen. heise Security konnte das Python-Skript auf einem Ubuntu problemlos einsetzen, unter Windows scheiterte die Ausführung hingegen. Vielleicht hat ja jemand Erbarmen mit den Windows-Nutzern und entwickelt eine PowerShell-Version des Skripts? (rei)