Oft meine ich, dass bei GNU/Linux.ch schon über alle grundsätzlichen Themen der Freien Software geschrieben wurde. Doch manchmal entdecke ich eine Lücke, die gefüllt werden möchte. Am Freitag musste ich eine Anzahl von Passwörtern für E-Mail-Konten eines Kunden erzeugen. Ich hätte die entsprechende Funktion in KeePassXC verwenden können, wollte ich aber nicht.
Anstatt den Passwort-Manager zu starten, mein eigenes Passwort einzutippen und dort über die Passwort-Funktion mehrere davon generieren zu lassen, war es mir lieber, diese Aufgabe im Terminal zu erledigen. Es gibt viele Möglichkeiten, Passwörter im Termin zu erzeugen. Einige setzten bestimmte Programme voraus, andere funktionieren mit Bordmitteln. Dabei spielt auch die Qualität der Passwörter eine Rolle. In diesem Artikel stelle ich zwei einfache Verfahren vor.
Das Programm GPG (The GNU Privacy Guard) ist eine vollständige und freie Implementierung des OpenPGP-Standards, wie er in RFC4880 definiert ist (auch bekannt als PGP). GnuPG ermöglicht es, deine Daten und deine Kommunikation zu verschlüsseln und zu signieren. Es kann aber auch Passwörter generieren. Der Befehl dafür lautet:
gpg --gen-random --armor 1 12
R5heFFGpv+o8I3Ai
--gen-random ist die GPG-Funktion, um eine Folge von Zufallsbytes der angegebenen Qualitätsstufe 0, 1 oder 2 ausgibt. Falls die Länge (im Beispiel: 12) nicht angegeben wird, wird eine endlose Folge von Zufallsbytes ausgegeben. Bei Verwendung von --armor wird die Ausgabe base64-kodiert. Ohne die Angabe von --armor erhaltet ihr eine nutzlose Bytefolge.
Doch was hat es mit der Qualitätsstufe (0, 1, 2) auf sich? Zwischen 0 und 1 gibt es keinen Unterschied. In beiden Fällen wird /dev/urandom/ als Quelle für Zufallswerte herangezogen. Dabei handelt es sich um Pseudo-Zufallswerte. Im Gegensatz dazu liefert /dev/random/ echte Zufallswerte. Daher ist die Qualitätsstufe 2 zu bevorzugen, falls ihr richtigen Zufall für eure Passwörter benötigt. urandom liefert Zufallswerte in unbeschränkter Länge, während random durch den Entropie-Pool eures Computers beschränkt ist. Ab einer bestimmten Länge liefert random nichts mehr. Ihr könnt das mit diesen beiden Befehlen ausprobieren und anschaulich machen:
od -d /dev/urandom
(mit Ctrl+c abbrechen)
od -d /dev/random
(der hört von alleine auf, sobald es keine Entropie mehr gibt, aber wartet nicht darauf)
Wer sich für die Unterschiede interessiert, kann sein Wissen hier vertiefen. Für den Zweck dieses Artikels sind diese Unterschiede absolut irrelevant. Es spielt keine Rolle, welche Qualitätsstufe ihr verwendet. Falls ihr eine Menge von Passwörtern benötigt, könnt ihr den Befehl gpg --gen-random --armor 1 12 beliebig oft wiederholen:
Das macht jedoch wenig Sinn, wenn ihr eine grosse Menge an Passwörtern benötigt. Für diesen Fall empfehle ich, diesen Befehl:
gpg --gen-random --armor 1
Ctrl+c
N6cWXwtd1TtxilK8Fo5wtWWfBqYE23nE/DDfxw9qAiuu
lJjaiFsCooh3jKeJtevH2qqXTzkzso6khy0RIr0L26ez6rKRB
qYxDG h/YymncTCHycPDI4g2sNIi8Wqeoeip3ueA2yyHtT
E2IZcVECqHBgnqAxxNkCdZqkK/qLGBWceI2z1sjhSXILG0
Q2y2VHFhqEyEoaM5TBa1S/sCVyfJuu+atPqCjALg4e4rPq
...
Achtung: Der Befehl haut in wahnwitziger Geschwindigkeit Unmengen an Zufallswerten heraus. Da müsst ihr schnell Ctrl+c drücken, um ihn abzubrechen. Dann habt ihr einen elend langen String mit Zufallswerten, aus dem ihr beliebig viele Passwörter in gewünschter Länge herauskopieren könnt.
Wenn ihr häufiger Passwörter erzeugen möchtet, könnt ihr einen Alias für den Befehl erstellen und diesen in eure Shell-Konfiguration schreiben (.bashrc, .zshrc, usw.)
alias pw='gpg --gen-random --armor 1 30'
Damit könnt ihr die Erzeugung eines Passwortes der Länge 30 durch den Aufruf des Befehls pw im Terminal erreichen.
Nachtrag
Vielen Dank für eure Kommentare. Ich habe mir die Sache noch einmal angesehen und festgestellt, dass einige Vorschläge zu lange Passwörter erzeugen, die teilweise mit Gleichheitszeichen aufgefüllt werden. Dazu gehört auch der von mir vorgeschlagene Befehl: gpg --gen-random --armor 1 Länge. Ihr seht das z. B. in meinem ersten Code-Beispiel oben in diesem Artikel; das sind mehr als 12 Zeichen. Die Variante head -c 5 /dev/urandom | base64 hat dasselbe Problem. Ich weiss nicht, warum das so ist.
Was funktioniert, ist das hier: < /dev/urandom tr -dc A-Za-z0-9 | head -c12; echo, oder in der Alias-Version:
# Passwort erzeugen. Aufruf: pw Länge_des_Passwortes
function pw() {
< /dev/urandom tr -dc A-Za-z0-9 | head -c$1; echo
}
Hier muss man eine Funktion in die Shell-Konfiguration schreiben, weil alias nicht mit der Variable $1 zurechtkommt.
Quellen:
Also falls man gpg nicht installiert hat kann man auch die Bordmittel nutzen mit: head -c 32 /dev/urandom | base64
Coole Sache, Danke! Das speicher ich mir gleich mal ab.
!/bin/bash
for i in {1..5} do openssl rand -base64 32 | tr -d /=+ | cut -c -16 | tr '[:upper:]' '[:lower:]' >> passwords.txt done
ist meine version einen passwordgenerators bashskripts, es erzeugt 5 passwoerter mit zahlen und kleinbuchstaben mit einer laenge von 16 zeichen und speichert es in in der datei passwords.txt im gleichen verzeichnis. die funktion ist, es erzeugt zuerst ein 32 zeichen passwort, dann loescht es die sonderzeichen raus (die passwoerter lassen sich dadurch mit einem maus-doppel-klick markieren), dann kuerzt es das passwort auf 16 stellen, danach wandelt es die gross- in kleinbuchstaben um und speichert es zuletzt in der datei passwords.txt . die passwoerter haben eine entropie von ca 10^25 und sind sehr leicht einzugeben.
Du meinst sicher: for i in {1..5}; do openssl rand -base64 32 | tr -d /=+ | cut -c -16 | tr '[:upper:]' '[:lower:]'; done (Bei dir fehlen vor do und done die semikolons)
ja so koennte man es schreiben, ich hab es einfach als mehrzeiliges skript geschrieben. allerdings sind hier dann die zeilenumbrueche weggelassen worden und die raute als erstes zeichen vor dem rufzeichen weggelassen worden und dafuer aber die erste zeile fett dargestellt worden. ich dachte aber es ist nicht so schlimm weil jeder der die bash benutzt die richtige syntax kennt
Danke für die Hintergrundinformationen. Ich nutze dazu meist
pwgen
(in letzter Zeit jedoch auch immer öfter den Firefox-internen Passwortgenerator). Z.B. generiert5 sichere (
-s
) Passwörter aus 12 Zeichen inklusive Sonderzeichen (-y
).pwgen
kann aber auch dazu benutzt werden sich leichter zu merkende, „aussprechbare“ Passwörter zu generieren.Interessant
gpg für die Passworterzeugung zu nutzen.
Python
Ich habe dafür immer Python genutzt, da ich hier mir alle Druckbarezeiche ausgeben lassen konnte. Aber auch die Länge bzw. die Komplexität. Zum Beispiel nur Alpha, Alphanumeric oder AlphaNumericSonderzeichen.
Ich habe mir aber auch dein gpg-alias eingetragen, falls ich es mal ganz einfach brauche ohne das ich erst mein Python-Script suchen gehen muss. Herzlichsten dank für diesen Informativen Artikel.
Ich habe einen Nachtrag geschrieben, weil mein Vorschlag und andere aus den Kommentaren nicht richtig funktionieren.
Der Teil über /dev/urandom und /dev/random stimmt so nicht wirklich (pseudo vs. echter Zufall) - du hast ja sogar die Quelle verlinkt, welche das widerlegt:
> Fact: Both /dev/urandom and /dev/random are using the exact same CSPRNG (a cryptographically secure pseudorandom number generator). They only differ in very few ways that have nothing to do with “true” randomness.
Oder, wenn die Zeichenzahl nicht wichtig ist, mit
diceware
:alias dw='diceware -w de_8k -d " " -n 5'
Ein Wörterbuch einer noch selteneren Sprache macht es vermutlich noch sicherer gegen viele Wörterbuchattacken, dann reichen möglicherweise 3 oder 4 Wörter?