Diceware: Sicher & deutsch

5 Würfel in einer Reihe

Diceware ist, laut Wikipedia, «eine einfache Methode, sichere und leicht erinnerbare Passwörter und Passphrasen mithilfe eines Würfels zu erzeugen».

Auf der Suche nach einem deutschsprachigen Diceware-Generator habe ich keinen gefunden, der nur im Browser läuft, also das Passwort nicht von einem Server lädt. Da man Passwörter mit niemandem teilen sollte, war das für mich keine Option.

Deine persönliche Diceware-Passphrase

Diese Passphrase auf Deutsch ist so sicher wie dein Computer. Sie wurde von deinem Browser auf deinem Computer erzeugt. Mein Webserver weiss nichts von deiner Passphrase. Und das ist auch gut so.

(Hier wäre deine Passphrase; scheinbar hat Javascript nicht funktioniert.)

Wie funktioniert Diceware?

Klassisch funktioniert Diceware so:

  1. Es werden 5 Würfel nacheinander gewürfelt und in dieser Reihenfolge abgelegt. Das gibt eine fünfstellige Zahl im Sechsersystem, also von ⚀⚀⚀⚀⚀ über ⚀⚀⚀⚀⚁, ⚀⚀⚀⚀⚂, …, ⚀⚀⚀⚀⚅, (an dieser Stelle geschieht der erste «Zehnerübergang», hier natürlich ein Sechserübergang) ⚀⚀⚀⚁⚀, ⚀⚀⚀⚁⚁, …, ⚅⚅⚅⚅⚅. Insgesamt sind das 6⁵=7776 Möglichkeiten.
  2. Für jede dieser 7776 Würfelzahlen gibt es in einem Büchlein oder einer Tabelle ein entsprechendes Wort. In dieser aufsteigend sortierten Liste wird der Wurfwert gesucht und das dazugehörige Wort aufgeschrieben.
  3. Die obigen zwei Punkte werden mehrfach ausgeführt, häufig 5 Mal.

Nach diesem Vorgang hast du 5 zufällige Wörter, die du als sichere Passphrase verwenden kann.

Mit 5 Wörtern ergeben sich 7776⁵ oder rund 28 Trillionen Kombinationen. Selbst wenn jemand den Algorithmus (und die verwendete Wortliste) kennt, braucht er zum Erraten dieser Passphrase im Durchschnitt 14 Trillionen Versuche.

In diesem Fall erledigt dein Computer das Würfeln und Nachschlagen in der Wörterliste für dich.

Ist denn das sicher?

Das kommt darauf an, wie Angreifer und Verteidiger aufgestellt sind (mehr dazu in «Ist 1234 ein gutes Passwort?»).

Nehmen wir einmal an, dass die Login-Maske einer Webapplikation pro anfragendem Rechner (bzw. IP-Adresse) 14 erfolglose Loginversuche pro Sekunde erlaubt (ein extrem hohes Limit, insbesondere, wenn es pro Rechner/IP-Adresse ist). Nehmen wir weiter an, dass dem Angreifer ein Botnetz mit einer Millon Rechnern zur Verfügung steht (ebenfalls ein sehr grosses Netz). Dann können wir gegen diese Loginmaske 14 Millionen Passwörter pro Stunde ausprobieren (bei einem professionell gemanagten Loginformular sollten allerspätestens dann Schutzmechanismen greifen).

Mit den so möglichen 14 Millionen Versuchen pro Sekunde bräuchte der Angreifer immer noch eine Billion Sekunden, bis er die Diceware-Passphrase mit 50% Wahrscheinlichkeit erraten hat. Das sind über 31'000 Jahre.

Ich denke, das dürfte für die meisten Online-Abfragen genügend sicher sein.

(Falls der Angreifer den Algorithmus oder die Wörterliste nicht kennt, die du für deine Passphrase-Generierung benutzt hast, braucht er nochmals bedeutend länger.)

Etwas mehr zur Technik

Die Wörterliste ist die «de-7776-v1.txt» von hier und ist wahlweise unter CC0, Unlicense oder BSD 3-Clause lizenziert. Du darfst damit also so gut wie alles machen, was du willst.

Dieser Javascript-Code ist ebenfalls unter CC0, Unlicense oder BSD 3-Clause lizenziert, nach deiner Wahl. Kurz: Du darfst damit machen, was du willst.

Übrigens: Die Zufallszahlfunktion könnte man für diesen Fall bei minimalem Security-Tradeoff kleiner halten (nur getRandomValues und der Modulo-Operator); aber immer wieder taucht das Bedürfnis für sichere Zufallszahlen auf. Das hier ist als allgemeine Funktion zur Wiederverwendung gedacht.

/**
 * Generate a bias-free cryptographic random integer less than `max`.
 *
 * To achieve this, the browser is asked for random numbers until
 * one less than n * max is returned, where n is the largest
 * integer such that n * max <= 2**32.
 * (Even in the worst case, max = 2**31 + 1, more than half of
 * the number space is valid; i.e., on average, fewer than 2
 * random numbers need to be obtained from the browser.)
 * The resulting number is a uniformly distributed integer < max.
 *
 * Then, the normal `modulo max` operation is used to
 * obtain an unbiased integer < max, uniformly distributed.
 */
function cryptoRandom(max) {
  max = Math.floor(max);
  if (max > 2**32 || max <= 0) {
    console.error("cryptoRandom: max not in (0, 2**32)", max);
    debugger;
  }
  // The largest multiple of max <= 2**32, to remove bias
  const limit = 2**32 - (2**32 % max);

  const value = new Uint32Array(1);

  // Do not include the last partial multiple of max.
  // On average, this loop will be run less than twice.
  do {
    crypto.getRandomValues(value);
  } while (value[0] >= limit);

  return value[0] % max;
}

/**
 * Generate a string of 5 random words from wordlist
 */
function diceware() {
  const words = [];
  for (let i = 0; i < 5; i++) {
    words.push(wordlist[cryptoRandom(wordlist.length)]);
  }
  document.getElementById("diceware").textContent = words.join(" ");
}

// Source: https://github.com/dys2p/wordlists-de/blob/main/de-7776-v1.txt, CC0
const wordlist = ["aalen","abarbeiten", /* 7774 weitere Wörter */ ];

diceware();

Aktuelles zu IT-Sicherheit


Bleibe auf dem Laufenden!

Erhalte eine Mail bei jedem neuen Artikel von mir.

Ca. 1-2 Mails pro Monat, kein Spam.

Folge mir im Fediverse

Marcel Waldvogel
Marcel Waldvogel
@blog@marcel-waldvogel.ch

(Technik-)Welt verstehen

171 Beiträge
5 Folgende

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Seite verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden..


Webapps