JavaScriptsSchutz

Zufallsschlüssel-Generator

Erzeugt Schlüssel, Token und UUIDs in Hexadezimal, Base64 oder als Lizenzschlüssel — mit echtem Zufall aus dem Betriebssystem.

Nicht jeder Zufallswert ist ein Passwort. Wer selbst programmiert, braucht ständig Zeichenketten, die niemand erraten können soll: einen Schlüssel für eine Schnittstelle, ein Token für einen Bestätigungslink, eine Kennung für einen Datensatz, einen Lizenzschlüssel für ein Programm. Dieses Script erzeugt sie in den gängigen Schreibweisen.

Stellt ein, wie viele Bytes Zufall der Schlüssel enthalten soll und in welcher Form er ausgegeben wird. Die Byte-Anzahl ist dabei das eigentliche Maß: 16 Bytes sind 128 Bit, das ist die übliche Untergrenze für alles, was ernsthaft geheim bleiben soll; 32 Bytes sind 256 Bit und damit reichlich. Die Schreibweise ändert nur das Aussehen, nicht die Stärke — derselbe Schlüssel ist in Hexadezimal doppelt so lang wie in Base64, enthält aber genau denselben Zufall.

Die Formen im Einzelnen: Hexadezimal nutzt die Ziffern 0–9 und die Buchstaben a–f, ist gut vorlesbar und in Konfigurationsdateien üblich. Base64 packt mehr Zufall in weniger Zeichen; die hier erzeugte Variante ist die URL-taugliche, das heißt ohne + und /, die in Adresszeilen Ärger machen. UUID Version 4 ist das genormte Format für Kennungen, an der festen Ziffer 4 in der dritten Gruppe erkennbar. Der Lizenzschlüssel schließlich ist eine Fünferblock-Schreibweise in Großbuchstaben ohne die Zeichen I, O, 0 und 1, die man beim Abtippen ständig verwechselt.

Der Zufall kommt aus crypto.getRandomValues und damit aus dem Betriebssystem, nicht aus Math.random. Alles läuft im Browser, es wird nichts übertragen. Für Zugangsdaten, die sich ein Mensch merken muss, ist der Passsatz-Generator die bessere Wahl; für reine Zahlencodes der PIN-Generator. Wie viel Sicherheit in einer Zeichenkette steckt, rechnet der Passwort-Stärke-Prüfer aus.

Schutz Baujahr 2026 läuft in deinem Browser

Bei UUID und Lizenzschlüssel liegt die Länge fest — das Byte-Feld wird dann nicht beachtet.

Script von kostenlose-javascripts.de

So funktioniert das Script

Alle vier Schreibweisen greifen auf dieselbe Quelle zu — eine Handvoll Zufallsbytes — und unterscheiden sich nur darin, wie sie diese Bytes in lesbare Zeichen übersetzen. Das lohnt sich anzuschauen, weil dieselbe Umrechnung überall auftaucht, wo Binärdaten durch Textfelder müssen.

const bytes = new Uint8Array(anzahl);
crypto.getRandomValues(bytes);

Ein Uint8Array ist ein Feld aus Bytes, also aus ganzen Zahlen von 0 bis 255. crypto.getRandomValues füllt das gesamte Feld auf einen Schlag mit Zufall aus dem Betriebssystem. Ab hier arbeitet das Script nur noch mit diesen Zahlen — der eigentliche Zufall ist damit schon fertig, alles Weitere ist reine Darstellung.

text += bytes[i].toString(16).padStart(2, "0");

toString(16) schreibt eine Zahl im Sechzehnersystem: aus 255 wird „ff", aus 10 wird „a". Genau da liegt die Falle — die 10 ergibt nur ein Zeichen, obwohl ein Byte immer zwei belegen muss, sonst verschiebt sich der ganze Rest. padStart(2, "0") füllt deshalb vorn mit einer Null auf. Wer mit Hexadezimalzahlen mehr anfangen möchte, findet in der Mathematik-Abteilung den Hexadezimal-Umrechner.

return btoa(roh).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");

btoa ist die eingebaute Base64-Umwandlung des Browsers. Ihr Ergebnis enthält aber die Zeichen + und /, die in einer Internetadresse eine eigene Bedeutung haben, sowie angehängte Gleichheitszeichen zum Auffüllen. Die drei replace-Aufrufe machen daraus die URL-taugliche Variante. Das g hinter dem Suchmuster steht für „global", also alle Fundstellen statt nur der ersten; /=+$/ bedeutet „ein oder mehrere Gleichheitszeichen am Ende".

bytes[6] = (bytes[6] & 15) | 64;
bytes[8] = (bytes[8] & 63) | 128;

Das ist der einzige Teil, der nicht rein zufällig sein darf. Eine UUID der Version 4 muss an zwei Stellen feste Bits tragen, damit man ihr ansieht, nach welchem Verfahren sie entstanden ist. & und | sind bitweise Operatoren: & 15 behält nur die unteren vier Bits und löscht die oberen, | 64 setzt anschließend das Bit für die Versionsnummer 4. Deshalb beginnt die dritte Gruppe jeder Version-4-UUID immer mit einer 4. Von den 128 Bit sind so sechs festgelegt, es bleiben 122 Bit echter Zufall.

do {
  crypto.getRandomValues(puffer);
  wert = puffer[0];
} while (wert >= 224);
text += lizenzZeichen.charAt(wert % 32);

Der Lizenzschlüssel benutzt einen Vorrat von 32 Zeichen — Großbuchstaben und Ziffern, aber ohne I, O, 0 und 1, weil die beim Abschreiben regelmäßig verwechselt werden. 224 ist das größte Vielfache von 32 unterhalb von 256; alles darüber wird verworfen, damit kein Zeichen häufiger vorkommt als die anderen. 25 Zeichen mal 5 Bit ergeben die 125 Bit, die unter dem Ergebnis stehen.

Zum Anpassen: Die Zeichenkette in lizenzZeichen bestimmt den Vorrat — sie muss genau 32 Zeichen lang bleiben, sonst stimmt die Verwerfungsgrenze nicht mehr. Für andere Blockgrößen ändert ihr die beiden Zahlen in den Schleifen von alsLizenz.

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.

Mehr aus der Kategorie Schutz