Benutzbare Passwörter

Spätestens, wenn man Passwörter per Hand eintippen oder gar per Telefon übermitteln muss, stoßen vom Passwortmanager generierte zufällige Kennwörter an ihre menschlichen Grenzen. Wer schon einmal versucht hat, ein Passwort wie 6Yb6JaER%9XV8bM$&LF7yjmt7QeSYoH$ am Telefon zu diktieren oder dieses vom Handybildschirm abzutippen, der sich alle 10 Sekunden ohne Eingabe abschaltet, weiß, von welcher Art von Frust ich hier rede.

Zugegeben, so ein 32-stelliges Passwort mit allen vier Komplexitätsklassen (Großschreibung, Kleinschreibung, Zahlen, Sonderzeichen) ist schon deutlich sicherer als alles, was selbst das BSI und auch mein aktueller Arbeitgeber für den täglichen Gebrauch fordern. Für reguläre Konten ist unsere Empfehlung, mindestens 12 Zeichen zu verwenden, je mehr Zeichenklassen, desto besser. Für administrative Konten empfehlen wir schon 16 Zeichen als Minimum, für Domänenadministrator- oder andere technische Konten mit weitreichenden Zugriffen sogar 24 Zeichen. Aber auch 16 Zeichen mit allen Komplexitätsklassen sind noch unhandlich und widersprechen dem, was das BSI Privatanwendern empfiehlt: Ein Passwort sollte man sich gut merken können.

Ein Lösungsansatz

Wie könnte also ein gutes Passwort aussehen? Ich wage einmal einen Vorstoß und generiere als Beispiel einfach einmal vier Passwörter, die meiner Auffassung nach ausreichend sicher sogar für administrative Zugänge sind und trotzdem kommunizierbar und im Zweifel halbwegs gut zu merken sind:

omnipräsent-Haushund.84.Krankenackte-unsensibel
Tabakrauch.7296.manchmal-Echszentrisch-Laurent
1 Hunt jongliert 13!!! krasse Käsezentrifugen
"Mööhrchenscheiben" ist doch k1 gutes Paßword!

Ungewöhnlich, oder? Sagt nicht sogar das BSI, man solle keine Wörter verwenden, die im Wörterbuch stehen?

Ich würde das sofort unterschreiben. Denn was die Experten des BSI meinen, ist folgendes: Passwörter, die nur aus einem Wort aus dem Wörterbuch und ggf. einem Anhängsel einer anderen Zeichenklasse bestehen, sind unsicher. Am Beispiel: Braunkohle12! ist lang genug, hat alle vier Zeichenklassen und ist dennoch innerhalb von Sekunden geknackt. Denn typische Angriffe auf Passwörter (zum Beispiel um aus erbeuteten Hashes die Klartextkennwärter zu erraten) arbeiten zuerst einmal mit Wörterbüchern und Permutationen der gefundenen Begriffe. Für jeden Begriff im angegebenen Wörterbuch werden verschiedene Modifikationen durchprobiert: Braunkohle, braunkohle, Braunkohle1, Braunkohle.1, Braunkohle!1, Braunkohle1., Braunkohle1!, … und schließlich auch Braunkohle12!. Das Anhängen von Zahlen und/oder Sonderzeichen in verschiedenen Kombinationen ist ziemlich beliebt, weil es einfach zu merken ist. Und moderne Passwort-Knacker haben die meisten der üblichen Permutationen im Repertoire. Wer einfach mal schauen möchte, welche Art von Passwörtern auch abseits der klassischen Sprach-Wörterbücher im ersten Versuch durchprobiert und -mutiert werden, kann sich hier einen ersten Eindruck verschaffen.

Doch man findet doch fast jedes der in den Beispielpasswörtern auftauchenden Wörter in Wörterbüchern, wie kann das dann sicher sein? Wird nicht ansonsten überall empfohlen, einen Satz, den man sich gut merken kann wie Ich habe keinen Hund, das ist mein Ernst! zu einem Konstrukt wie Ihk1H&,dim3! zu verkürzen, das dann seinerseits durch die Kenntnis des Satzes irgendwie halbwegs abgeleitet werden kann, so dass man es sich indirekt merken kann?

Schauen wir uns die Mathematik an. Disclaimer: Ich bin weder Mathematiker noch Kryptologe, ich langweile mich bei rein mathematischen Themen zu Tode und vermutlich haben meine Laien-Rechenwege ein paar Fehler, doch ich glaube, dass ich trotzdem ungefähr in den richtigen Größenordnungen lande.

Gar nicht so langweilige Mathematik

Ein Passwort aus 12 Zeichen mit allen vier Komplexitätsklassen hat ungefähr 106.000.000.000.000.000.000.000 (106 Trilliarden) mögliche Kombinationen. Das ist eine ganze Menge und mit normalen Computern beißt man sich daran schon ziemlich die Zähne aus. Mit 12 Nvidia RTX 4090 Grafikkarten als Beschleuniger würde man bis zu 140-150 Millionen Jahre rechnen müssen, um ein wirklich zufälliges Passwort dieser Länge und Komplexität garantiert zu knacken.

Doch wie kommt man auf 106 Trilliarden Möglichkeiten?

  • Das Alphabet hat 26 Buchstaben, mit Groß- und Kleinbuchstaben kommen wir also auf 52 Zeichen
  • Zusätzlich nutzen wir 10 Ziffern von 0 bis 9
  • Sonderzeichen gibt es reichlich, doch die gebräuchlichsten (!"$%&()=?+-*#_:;) sowie die im deutschen Sprachraum verwendeten Umlaute, das ß und das Leerzeichen sind ca. 21 Zeichen

Wir haben also insgesamt 83 Zeichen, die wir in Passwörtern üblicherweise verwenden. Diese Zahl unterscheidet sich je nach Sprachraum, bewegt sich jedoch im EU-, und US-Raum immer ungefähr in dieser Größenordnung. Wenn wir jetzt diese 83 Zeichen 12 mal hintereinander verwenden, stellt man dies mathematisch wie folgt dar: 8312

8312 ergibt eine Zahl mit 24 Stellen, nämlich ganz knapp über 106 Trilliarden. Das sind die möglichen Kombinationen, die mit diesem Zeichenraum mit 12 Zeichen möglich sind.

Dieselbe Mathematik für Wörter

Schauen wir uns nun den vorgestellten Ansatz an. Statt mit Zeichen arbeiten wir mit Wörtern. Da wir Wörter aus dem Wörterbuch wie einzelne Buchstaben aus dem Alphabet behandeln, ist die Methode aus mathematischer Sicht (und auch praktisch) gesehen vollkommen identisch.

Wir nehmen an, dass ein Wörterbuch mit ca. 100.000 deutschen Wörtern verwendet wird, auch wenn die deutsche Sprache wesentlich mehr Wörter kennt. Für unser Beispiel reicht uns diese vereinfachte Ansicht aus. Und mit vier Wörtern komme ich alleine schon auf 100.000.000.000.000.000.000 (also 100 Trillionen) mögliche Kombinationen. Also knapp um den Faktor 1000 niedriger als das vorige Beispiel. Nehmen wir zudem an, dass die zusätzliche Zahl, die an jeder Stelle des Passwortes die Position mit einem Wort tauschen kann, von 0 bis 99999 jeden Wert annehmen kann, gibt es für diese Zahl genauso viele Werte wie für die Wörterbuch-Wörter, also rechnen wir inzwischen mit 100.0005. Damit überschreiten wir bereits die Komplexität eines 12stelligen Passwortes aus wirklich zufälligen Zeichen deutlich. Zusätzlich steht zwischen den Wörtern/Zahlen jeweils ein Sonderzeichen, das wieder 21 Werte haben kann, also multiplizieren wir das Ergebnis mit 214 (also 194.481) und kommen am Ende auf 1.944.810.000.000.000.000.000.000.000.000, also fast zwei Quintillionen Möglichkeiten.

Selbst wenn wir Sonder- und Trennzeichen nicht so vorhhersehbar verwenden oder auch komplett weglassen, dürfte ein Erraten oder Berechnen des Passwortes in naher Zukunft ausgeschlossen sein.

Weitere Komplexitätserhöhung durch Fehler

Aufmerksamen Lesern mag aufgefallen sein, dass in jedem der vier Beispiele mindestens ein Rechtschreibfehler, also eine Abweichung vom Wörterbuch, eingebaut ist. Denn wenn automatisierte Wörterbuch-Attacken an einem scheitern, dann an Wörtern, die so nicht im Wörterbuch stehen.

Automatische Permutationen an den Wörtern selbst finden zwar je nach Methode statt, allerdings meistens nur Ersetzungen wie ss->ß oder ae->ä und umgekehrt. Auch Leetspeak, also das Austauschen von Buchstaben mit ähnlich aussehenden Zeichen (aus A wird 4, aus E wird 3, aus O wird 0 und so weiter), beherrschen viele Algorithmen, doch zufällige Rechtschreibfehler lassen sich programmatisch bei derartigen Attacken nicht sonderlich sinnvoll integrieren. Erkennen? Ja. Durchhrechnen? Unhandlich und rechenzeitaufwändig.

Und damit lässt sich die Komplexität mit nur wenigen Zeichen derart erhöhen, dass Wörterbuch-Attacken ins Leere laufen. Diese wären sowieso nur erfolgreich anwendbar, wenn alle verwendeten Passwörter dieselbe Struktur hätten, also hilft hier Variation: Das Muster “[Wort1].[Wort2].[Zahl].[Wort3].[Wort4]!” ist, wenn man es einmal kennt, automatisiert einfacher zu knacken als ein zufälliges Muster, bei dem die Zahl an jeder Stelle stehen kann und statt den Punkten beliebige Sonderzeichen verwendet werden - oder auch mal gar keins, wodurch ein neues Wort entstehen würde, das ggf. gar nicht im Wörterbuch steht. Mit klassischen Brute-Force-Attacken, die bereits bei 12 Stellen und allen Zeichenklassen Millionen Jahre lang rechnen müssten, kommt man derart langen Passwörtern natürlich gar nicht bei.

Abschließendes

Die vorgestellte Methode steht und fällt zusätzlich mit der Wahl der Wörter, die das Passwort bilden. Wer sein Passwort oder besser seinen Pass-Satz aus bekannten Texten bildet, könnte es zukünftigen “Zitat-Attacken” leicht machen, Passwörter zu erraten. Alle Sätze eines Buches oder eines Liedes durchzuprobieren und auch hier gängige Ersetzungen durchzuführen, ist technisch keine große Herausforderung. Also am besten eigene Sätze oder wirklich zufällige Wortkombinationen verwenden (ein entsprechendes Script stelle ich in Kürze hier bereit), damit dieser Weg niemals offen steht.

Doch auch mit einem sicheren Passwort, wie auch immer das nun aussehen mag, sollte man niemals vergessen, dass ein Passwort nur dann sicher ist, wenn man es nur für einen Dienst verwendet. Sobald man ein Passwort für mehrere Anmeldungen nutzt, muss es nur an einer Stelle abgegriffen werden, und alle weiteren Dienste, wo man es verwendet, gehhen an demjenigen, der es mitlesen oder anderweitig brechen konnte. Bei eindeutigen Kennwörtern würde das nur einen Account betreffen. Mehr dazu im Artikel über Passwortmanager. Und wer verhindern möchte, dass ein Abhandenkommen eines Passwortes einem Dritten überhaupt Zugriff erlaubt, sollte sich den Artikel über 2FA/MFA anschauen, denn ohne den zusätzlichen Code, der auf einem Gerät im eigenen Besitz generiert wird, kann sich niemand an Diensten, die die Nutzung eines zweites Faktors ermöglichen, anmelden.

Passwortgenerierungs-Snippet

Unter Linux lassen sich Passwörter wie eingangs beschrieben sehr leicht generieren. Man benötigt nur ein kleines Script und eine Textdatei, die möglichst viele Wörter enthält. Die verlinkte Datei hat ca. 2 Millionen Zeilen, also deutlich mehr als im Rechenbeispiel oben. Im Beispielscript gibt es zudem einen Konfigurationsblock, der relativ selbsterklärend sein dürfte und der die Generierung der Passwörter steuert:

# START configuration
use_random_delimiter=0
static_delimiter='-'
number_of_words=4
dictionary="wordlist-german.txt"
# END configuration

Das Script muss nach dem Speichern noch mit chmod +x generate.sh ausführbar gemacht werden und die wordlist-german.txt im selben Verzeichnis abgelegt werden. Natürlich kann man auch jede andere Datei verwenden, die in jeder Zeile ein Wort stehen hat, der Name der Datei kann im Script mit dem dictionary-Parameter angepasst werden.

Ein Aufruf sieht nun etwa so aus:

# Mit use_random_delimiter=0
$ ./generate.sh
reinigungspflichtige-Toilettendamen-82759-Fuchsjägern-gehüllter

# Mit use_random_delimiter=1
$ ./generate.sh
53367$Absturzopfer.Fichtenspargel!hineinströmenden>hindurchsteckenden