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.
🔧 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 das Muster kennt, nach dem ein Passwort gebaut ist, muss deutlich weniger raten – und dann wäre der ganze Aufwand für die Katz.
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.