TL;DR: Mit tr, /dev/urandom und head lassen sich sichere Passwörter mit wenigen Zeichen erzeugen.
Ab und zu muss man für irgendeinen Account, Postfach, Zugang, WLAN, wasauchimmer ein Passwort festlegen. Jetzt zufällig auf der Tastatur rumzuhämmern wäre eine Möglichkeit, aber leider eine nicht sehr effektive, weil die statistische Verteilung der gewählten Zeichen sehr eingeschränkt ist.
Besser ist es den Entropiegenerator eines Linux-Systems zu nutzen. Egal ob PC oder Raspi /dev/urandom ist für kryptographische Zwecke geeignet und blockiert nicht. Der Haken ist, urandom liefert Bytes, keine Zeichen. Jetzt wollen wir aber unser Passwort aus bestimmten Zeichen mit einer bestimmten Länge aufbauen. Daher müssen wir uns aus dem zufälligen Datenstrom nur die Zeichen rauspicken, die wir möchten. Dafür gibt es den Befehl <a href="https://wiki.ubuntuusers.de/tr/">tr</a>
$ tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 8
Dieser Befehl nimmt von urandom Bytes entgegen, entfernt alle Zeichen (-d delete) die nicht (-c complement) im Bereich „A-Za-z0-9“ sind und piped es an head, dass nur 8 Zeichen ausgibt. Voilà, ein schnelles zufälliges Passwort.
Entsprechend kann man den Befehl modifizieren, wie man will:
16-stellige Zahl:
$ tr -dc '0-9' < /dev/urandom | head -c 16
Nur 10 Zahlen und Kleinbuchstaben:
$ tr -dc 'a-z0-9' < /dev/urandom | head -c 10
Und jetzt ein richtig sicheres Passwort mit 16 Stellen und diversen Sonderzeichen:
$ tr -dc 'A-Za-z0-9!$%&(),.-;:#+' < /dev/urandom | head -c 16
Jetzt wäre es zur besseren Lesbarkeit noch von Vorteil, das Passwort in z.B. Viererblöcke aufzuteilen:
$ tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 16 | sed 's/.\{4\}/&-/g; s/-$/ņ/'
liefert z.B. H86s-qPDq-GxrW-aygB
Der Befehl sed fügt immer nach vier Zeichen einen Bindestrich. Und der letzte Bindestrich wird durch einen Zeilenvorschub ersetzt.
Es müssen aber auch nicht immer Buchstaben mit dabei sein. Ein sicherer WLAN-PSK kann auch nur aus Ziffern bestehen:
$ tr -dc '0-9' < /dev/urandom \
| head -c 20 \
| sed 's/.\{4\}/&-/g; s/-$/\n/'
liefert z.B. 7261-5080-8575-6163-4431
Letzte Empfehlung:
$ LC_ALL=C tr -dc 'A-Za-z0-9' < /dev/urandom \
| head -c 16 \
| sed 's/.\{4\}/&-/g; s/-$/\n/'
LC_ALL=C stellt sicher, dass tr byteweise im klassischen ASCII-Modus arbeitet und nicht von Sprach- oder UTF-8-Locales beeinflusst wird. Das sorgt für reproduzierbares und sauberes Verhalten bei Zufallsdaten aus /dev/urandom.
Als nächstes verpacken wir das in ein Bash-Skript..