PIN-Generator
Erzeugt zufällige Zahlencodes von 4 bis 12 Stellen — auf Wunsch ohne Wiederholungen und ohne aufsteigende Folgen.
Manchmal braucht man keinen Passsatz, sondern schlicht eine Zahl: für das Türschloss, das Tresorfach, die SIM-Karte oder den Zugangscode zum Vereinsheim. Dieses Script würfelt solche Codes — von der klassischen vierstelligen PIN bis zu zwölf Stellen. Ihr könnt euch mehrere Vorschläge auf einmal ausgeben lassen und euch den angenehmsten heraussuchen.
Zwei Zusatzoptionen helfen gegen Codes, die zwar zufällig entstanden sind, aber ungünstig aussehen. „Jede Ziffer nur einmal" verhindert Doppelungen wie 4417 — praktisch bei Tastenfeldern, an denen man den Abrieb der gedrückten Tasten sieht, denn eine wiederholte Ziffer verrät sich dort nicht. „Keine Folgen" wirft Vorschläge weg, in denen drei oder mehr Ziffern hintereinander auf- oder absteigen (1234, 9876), weil solche Codes zuerst durchprobiert werden.
Ehrlicherweise gehört dazugesagt: Jede dieser Regeln verkleinert die Menge der möglichen Codes und macht den Code damit rechnerisch schwächer, nicht stärker. Eine vierstellige PIN hat 10.000 Möglichkeiten, das sind rund 13 Bit — wenig. Sie ist nur deshalb brauchbar, weil Geldautomaten und Türschlösser nach drei Fehlversuchen sperren. Wo diese Bremse fehlt, gehört kein Zahlencode hin, sondern ein Passsatz oder ein Passwort aus dem Passwortgenerator.
Der Zufall stammt aus crypto.getRandomValues, dem Zufallsgenerator des Betriebssystems. Alles läuft im Browser; die erzeugten Codes werden weder übertragen noch gespeichert. Wie stark ein Code ist, könnt ihr im Passwort-Stärke-Prüfer nachrechnen.
Die Codes entstehen in eurem Browser und werden nirgends übertragen oder gespeichert.
So funktioniert das Script
Das Script besteht aus vier Funktionen: eine würfelt eine einzelne Ziffer, eine prüft auf aufsteigende Folgen, eine baut daraus einen einzelnen Code, und die letzte liest die Formularfelder aus und gibt das Ergebnis aus.
do {
crypto.getRandomValues(puffer);
wert = puffer[0];
} while (wert >= 250);
return wert % 10;
crypto.getRandomValues liefert eine Zahl von 0 bis 255. Wollte man daraus mit wert % 10 direkt eine Ziffer machen, kämen 0 bis 5 häufiger heraus als 6 bis 9, weil 256 nicht durch 10 teilbar ist. Die Schleife verwirft deshalb alle Werte ab 250 und würfelt neu — 250 ist das größte Vielfache von 10 unterhalb von 256. So sind alle zehn Ziffern exakt gleich wahrscheinlich.
const schritt = code[i] - code[i - 1];
const vorschritt = i > 1 ? code[i - 1] - code[i - 2] : 99;
if ((schritt === 1 || schritt === -1) && schritt === vorschritt) {
laenge++;
…
}
Die Folgenprüfung schaut sich jeweils den Abstand zweier benachbarter Ziffern an. Ist er +1 oder −1 und genauso groß wie der Abstand davor, wächst die laufende Folge. Bei 1234 ist der Schritt dreimal +1, die Folgenlänge erreicht 3 und der Code wird verworfen. Bei 1235 endet die Folge bei 3 — knapp am Verwerfen vorbei. Der Fragezeichen-Doppelpunkt-Ausdruck ist die Kurzform einer if-Abfrage: „falls i > 1, nimm die Differenz, sonst 99" — 99 als Wert, der nie passt.
for (let versuch = 0; versuch < 200; versuch++) {
…
if (ohneFolgen && hatFolge(ziffern)) continue;
return ziffern.join("");
}
return null;
Das ist die Verwerfungsmethode noch einmal, jetzt auf ganze Codes angewandt: würfeln, prüfen, bei Nichtgefallen von vorn. Der Zähler versuch ist eine Notbremse. Ohne ihn liefe die Schleife bei widersprüchlichen Vorgaben endlos und der Browser-Tab würde einfrieren — eine der häufigsten Ursachen für hängende Seiten. null als Rückgabewert heißt „nichts gefunden", und die aufrufende Funktion sagt es dem Besucher.
while (ziffern.indexOf(z) !== -1) {
z = zufallsziffer();
…
}
So wird „jede Ziffer nur einmal" umgesetzt: indexOf sucht die frisch gewürfelte Ziffer in den bereits gezogenen. Liefert es etwas anderes als -1, war sie schon dabei und es wird neu gewürfelt. Ab der zehnten Stelle wäre das unmöglich, deshalb fängt die Hauptfunktion diesen Fall vorher mit einer Meldung ab.
Zum Anpassen: Wollt ihr Codes ohne Null (manche alten Schlösser haben keine), ersetzt in zufallsziffer die Rückgabe durch 1 + wert % 9 und die Verwerfungsgrenze 250 durch 252. Sollen die Codes gruppiert erscheinen (etwa 12 34 56), fügt beim Zusammenbauen alle zwei Stellen ein Leerzeichen ein.
Script für die eigene Homepage
Kopiert euch den kompletten Code und fügt ihn an der Stelle eurer Seite ein, an der das Script erscheinen soll. Er läuft ohne weitere Dateien und ohne fremde Server.