Im Januar habe ich beschrieben, wie ich von Vaultwarden zu KeePass + KeeWeb gewechselt bin. KundenzugĂ€nge gehen seitdem als Link raus â sauber, verschlĂŒsselt, kein Account nötig. Nur: Manchmal hilft der schönste Link nichts, weil der Kunde gerade am Telefon ist und das Passwort jetzt braucht.
Und genau da fangen die Probleme an.
đ€ „GroĂes B wie Berta, dann Klammeraffe, dann eine Eins ⊓
Ein normal generiertes Passwort sieht aus wie 7kQ$vL2!mZp9@rTx.
Kryptografisch tadellos â am Telefon eine Katastrophe. Jedes zweite Zeichen
braucht eine RĂŒckfrage:
- đ I, l und 1 â groĂes i, kleines L oder Eins?
- â O und 0 â Buchstabe oder Ziffer?
- đ GroĂ oder klein? â bei jedem einzelnen Buchstaben
- âšïž Sonderzeichen â auf jeder Tastatur woanders
- đ” Umlaute und Ă â spĂ€testens beim auslĂ€ndischen Kunden vorbei
Ein 16-stelliges Zufallspasswort durchzugeben dauert so gut und gerne fĂŒnf Minuten, und am Ende hat man es trotzdem zweimal falsch. Das musste anders gehen.
đČ Diceware statt Zeichensalat
Die Idee dahinter ist alt und gut: Diceware. Statt zufĂ€lliger Zeichen wĂŒrfelt man zufĂ€llige Wörter aus einer festen Liste. Die Sicherheit kommt nicht aus dem Zeichensalat, sondern aus der Anzahl der Möglichkeiten â und die ist bei ausreichend vielen Wörtern locker so groĂ wie bei einem Zeichenpasswort.
Der Unterschied merkt man am Telefon: Ein Wort sagt man einmal, und es ist angekommen. Kein Buchstabieren, kein „war das jetzt groĂ oder klein“.
đ§© Das Plugin: KeePassDiceware
KeePass bringt von Haus aus keinen Diceware-Generator mit â aber es gibt ein Plugin dafĂŒr: KeePassDiceware. Es klinkt sich direkt in den Passwortgenerator ein, und man bekommt ein eigenes Profil mit den ĂŒblichen Schaltern:
- đą Anzahl der Wörter
- â Trennzeichen zwischen den Wörtern
- đĄ GroĂ-/Kleinschreibung
- đ§ Salt und L33t-Speak â beides bei mir aus, siehe oben
- đ Wortlisten â mitgeliefert oder eigene
Damit war die halbe Miete drin. Die andere HĂ€lfte war die Wortliste.
đ Eine eigene Wortliste â 4.000 Wörter, alle gleich lang
Die mitgelieferten Listen sind englisch, und die deutschen, die man im Netz findet, sind fĂŒr meinen Zweck unbrauchbar: Umlaute drin, WortlĂ€ngen von drei bis fĂŒnfzehn Buchstaben, und viel zu viele Wörter, die am Telefon gleich klingen.
Also habe ich mir eine eigene gebaut. 4.000 deutsche Wörter nach harten Kriterien:
- đ Genau sechs Buchstaben â jeder Block ist gleich lang, die GesamtlĂ€nge damit vorhersagbar
- đ€ Nur ASCII â keine Umlaute, kein Ă
- đŁïž Leicht auszusprechen â höchstens zwei Silben, klare Konsonanten
- đ Am Telefon eindeutig â nichts, was sich mit einem anderen Wort der Liste reimt oder verwechseln lĂ€sst
- đ§č Ausgemistet â missverstĂ€ndliche und unpassende Begriffe sind raus
Dazu kommt ein Kniff: Vor jedes Wort kommt eine Ziffer. Aus 4.000 Wörtern und zehn Ziffern werden so 40.000 verschiedene Blöcke â und gleichzeitig ist die Ziffernpflicht erfĂŒllt, die einem manche Systeme aufzwingen. So sieht das aus:
7garten-3wasser-1kerzen- âŠ
Man liest es einmal vor, der Kunde tippt mit, fertig. Keine RĂŒckfrage.
đą Moment â 40.000, ist das nicht viel zu wenig?
Die Zahl klingt harmlos, und genau da liegt das MissverstÀndnis: Es sind 40.000 Möglichkeiten pro Block. Ein Passwort besteht aber aus mehreren, und die Zahlen werden nicht addiert, sondern multipliziert. Jeder zusÀtzliche Block nimmt das Bisherige mal 40.000.
In der WĂ€hrung, in der man so etwas misst, bringt ein Block rund 15 Bit Zufall mit. Bevor die Zahlen kommen, kurz der Fall, fĂŒr den sie gelten â und dafĂŒr muss ich ein Wort erklĂ€ren.
Ein ordentlicher Anbieter speichert dein Passwort gar nicht. Er speichert eine Art Fingerabdruck davon: eine feste Zeichenfolge, die sich aus dem Passwort ausrechnen lĂ€sst â aber nicht zurĂŒck. Das ist ein Hash. Meldest du dich an, rechnet er den Fingerabdruck erneut aus und vergleicht ihn mit dem gespeicherten. Dein Passwort selbst bekommt er nie zu sehen, und deshalb kann er es dir auch nicht zumailen, wenn du es vergisst.
Wenn jetzt ein Dieb im unangenehmsten Fall den Hash erbeutet hat… âErbeutet“ heiĂt dann: Bei diesem Anbieter wurde eingebrochen und die Nutzerdatenbank kopiert â so etwas steht regelmĂ€Ăig in den Nachrichten. Der Dieb hat damit nicht die Passwörter, sondern die FingerabdrĂŒcke. Was er tun kann: auf seinem eigenen Rechner massenhaft Passwörter raten, fĂŒr jedes den Fingerabdruck ausrechnen und schauen, ob einer davon passt.
Genau das ist der unangenehme Fall, und zwar aus einem Grund: Am Anmeldeformular wĂ€re er nach drei Fehlversuchen gesperrt. Zu Hause hindert ihn niemand â er darf raten, so schnell seine Hardware es hergibt. Angenommen sind hier 100 Milliarden Versuche pro Sekunde, eine realistische GröĂenordnung fĂŒr ein Gestell voller Grafikkarten und ein schnelles Rechenverfahren.
- 4ïžâŁ Vier Blöcke â 2,6 Trillionen Möglichkeiten, gut 61 Bit: gut neun Monate Durchprobieren
- 5ïžâŁ FĂŒnf Blöcke â 76 Bit: rund 32.000 Jahre
- 6ïžâŁ Sechs Blöcke â 92 Bit: rund 1,3 Milliarden Jahre
- 7ïžâŁ Sieben Blöcke â 107 Bit: rund 52 Billionen Jahre
Aus Monaten werden Jahrtausende, aus Jahrtausenden Erdzeitalter â und das nur,
weil jeweils ein weiteres Wort dazukommt, das man am Telefon in einer Sekunde
vorliest. Und das 16-stellige Zeichenpasswort vom Anfang,
7kQ$vL2!mZp9@rTx? Das liegt bei etwa 105 Bit.
Ab sieben Blöcken ist die vorlesbare Variante die stĂ€rkere â bei
einem Bruchteil des Ărgers.
Drei Ehrlichkeiten gehören dazu. Erstens sind das Höchstwerte; im Mittel ist ein Angreifer nach der HĂ€lfte der Zeit fertig. Zweitens gilt die Rechnung fĂŒr ein schnelles Hash-Verfahren â setzt der Dienst ein modernes, absichtlich langsames ein, wird daraus noch einmal ein Vielfaches. Drittens hilft gegen ein abgefischtes Passwort oder einen Anbieter, der Passwörter im Klartext ablegt, keine Entropie der Welt.
Was die Zahlen ausdrĂŒcklich nicht voraussetzen: dass der Angreifer ahnungslos ist. Sie gelten fĂŒr jemanden, der das Verfahren kennt â Wortliste, BlocklĂ€nge, Ziffer davor. So gehört es gerechnet. Sicherheit, die auf Nichtwissen beruht, ist keine.
đ§ Eine Zeile Quellcode
Ein Detail wollte ich noch: einen festen Anhang am Ende, immer gleich, damit ich meine eigenen Passwörter auf einen Blick erkenne. Das kann das Plugin nicht â es gibt keine Einstellung fĂŒr einen festen Suffix.
Also habe ich mir den Quellcode geschnappt. Die Stelle in
DicewarePwGenerator.cs ist genau eine Zeile:
string result = Diceware.Generate(_options, profile, random);
result += "-xy";
return new ProtectedString(false, result);
Danach den KeePass-Pfad in der KeePass.props eintragen, einmal
bauen â und die fertige DLL in den Plugin-Ordner kopieren:
dotnet build KeePassDiceware.sln -c Release
Das automatische Kopieren nach dem Build habe ich bewusst deaktiviert: Der
Plugin-Ordner liegt unter C:\Program Files\ und ist schreibgeschĂŒtzt â
der Build wÀre sonst bei jedem Durchlauf an den fehlenden Rechten gescheitert.
Einmal von Hand rĂŒberziehen ist ehrlicher als ein Build, der stĂ€ndig rot wird.
Ein Wermutstropfen bleibt: Wenn das Originalprojekt aktualisiert wird, muss die eine Zeile wieder rein. Schöner wĂ€re eine richtige Option „Fixed suffix“ in den Einstellungen â vielleicht baue ich die irgendwann und schicke sie upstream zurĂŒck.
đ€« Was ich nicht verrate
Wie viele Blöcke ich tatsĂ€chlich verwende und was bei mir hinten dranhĂ€ngt, behalte ich fĂŒr mich. Wer die Blockzahl kennt, muss weniger durchprobieren. Die Rechnung oben trĂ€gt zwar auch ohne dieses Versteck â sie geht ja davon aus, dass das Verfahren bekannt ist. Aber geschenkt wird trotzdem nichts.
Und noch etwas gehört zur Ehrlichkeit dazu: Ein fester Anhang macht ein Passwort nicht sicherer. Er ist immer gleich, trĂ€gt also nichts zur ZufĂ€lligkeit bei. Die Sicherheit steckt ausschlieĂlich in den gewĂŒrfelten Blöcken davor â der Anhang ist reine Bequemlichkeit. Wer so etwas einbaut, sollte es wissen und nicht als zusĂ€tzliche Stelle mitzĂ€hlen.
Fazit
Aus einem AlltagsĂ€rgernis â „kannst du mir das eben durchgeben?“ â ist ein Generator geworden, der Passwörter erzeugt, die man vorlesen kann, ohne zu buchstabieren. Gleiche LĂ€nge, keine Umlaute, keine Verwechslungen, und trotzdem genug Zufall dahinter.
Das Beste daran: Es war keine groĂe Sache. Ein bestehendes Open-Source-Plugin, eine sorgfĂ€ltig zusammengestellte Wortliste und eine einzige Zeile C#. đČ
Fragen dazu, oder eine Wortliste fĂŒr eine andere Sprache im Kopf? Melde dich gerne â einfach Kontakt aufnehmen.