Passwort im Terminal generieren

  Ralf Hersel   Lesezeit: 6 Minuten  🗪 10 Kommentare

Eines oder mehrere Passwörter in beliebiger Länge mit einem Befehl erzeugen.

passwort im terminal generieren

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:

https://gnupg.org/

https://www.2uo.de/myths-about-urandom/

Tags

Passwort, password, GPG, terminal, cli

Tealk
Geschrieben von Tealk am 9. Oktober 2023 um 09:37

Also falls man gpg nicht installiert hat kann man auch die Bordmittel nutzen mit: head -c 32 /dev/urandom | base64

El Pollo Diablo
Geschrieben von El Pollo Diablo am 9. Oktober 2023 um 15:34

Coole Sache, Danke! Das speicher ich mir gleich mal ab.

y1n
Geschrieben von y1n am 9. Oktober 2023 um 09:45

!/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.

UbIx
Geschrieben von UbIx am 9. Oktober 2023 um 21:31

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)

y1n
Geschrieben von y1n am 10. Oktober 2023 um 11:11

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

Robert
Geschrieben von Robert am 9. Oktober 2023 um 11:10

Danke für die Hintergrundinformationen. Ich nutze dazu meist pwgen (in letzter Zeit jedoch auch immer öfter den Firefox-internen Passwortgenerator). Z.B. generiert

pwgen -sy 12 5

5 sichere (-s) Passwörter aus 12 Zeichen inklusive Sonderzeichen (-y). pwgenkann aber auch dazu benutzt werden sich leichter zu merkende, „aussprechbare“ Passwörter zu generieren.

Claudia
Geschrieben von Claudia am 9. Oktober 2023 um 13:32

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.

Ralf Hersel Admin
Geschrieben von Ralf Hersel am 9. Oktober 2023 um 19:12

Ich habe einen Nachtrag geschrieben, weil mein Vorschlag und andere aus den Kommentaren nicht richtig funktionieren.

Varbin
Geschrieben von Varbin am 10. Oktober 2023 um 09:49

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.

kamome
Geschrieben von kamome am 10. Oktober 2023 um 10:27

Oder, wenn die Zeichenzahl nicht wichtig ist, mit diceware :

alias dw='diceware -w de_8k -d &quot; &quot; -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?