Hallo Rainer,
das ist eine echt gute Frage!! Vielen Dank dafür. Wo hast du das Kommando her?
Und das ist nicht nur ein Befehl, sondern eine Verschachtelung von Befehlen.
Zunächst mal das hier:
$(dd if=/dev/urandom bs=128 count=1 2> /dev/null | base64)
Wenn du das einzeln in der Shell ausführst - z.B. so:
echo $(dd if=/dev/urandom bs=128 count=1 2> /dev/null | base64)
kommt zum Biespiel das bei raus:
7WUHcpOWWdAkGkYSVf2pEjyy1IFBKlkn/uxArtjHt7BUGb+iBDBcuCNlggMeby1c6jOChfBKmi7s uH+SAkkuq/PfX0xNZrjblL+dBiwSZHyVkA9asCxLd1THujnDj9VvZU1jaCmOXxol07aGbI04L2do s/XRrcFpePUK5V2lPsA=
Das Kommando "
dd
" wird hier benutzt um von /dev/urandom (if=/dev/urandom) zu lesen. Das sind Zufallszahlen. "dd" liest genau 128 Bytes an Zufallswerten (bs=128 count=1).
dd if=/dev/urandom bs=128 count=1 2> /dev/null
Was macht
"2> /dev/null" ?
Dieser Ausdruck leitet die Standardfehlerausgabe um nach "nirgendwo". /dev/null ist die Müllhalde, das Datennirvana. Ein Witz unter Unixleuten ist es doch das Backup nach >/dev/null zu machen, da das sehr schnell ist.
Warum braucht man das hier?
Das dd Kommand gibt auch Daten auf dem Fehlerkanal aus, die sich ansonsten in die Ausgabe der Pipe und damit in das Format des Passworts mischen könnten, wenn man das nicht umleitet. Lässt man das weg, funktioniert das Kommando nicht mehr.
Beispiel (gleiches Kommando wie oben, nur ohne 2>/dev/null):
echo $(dd if=/dev/urandom bs=128 count=1 | base64)
1+0 Datensätze ein
1+0 Datensätze aus
128 Bytes kopiert, 0,0002601 s, 492 kB/s
2pzF48N/n8GabErMdEuigF+C3c2IqiA6dHah+wBf0sKabSf70r/VT2rL90vMMu3jJZn/ku8jSLnm NgWK2NWohofT2tGknhbJzuzXUQXfMHuLkWMBCORQiUjjWzD8OYMer7QOaGfyHj70huNE0EJL/0Mi MYxGL0o+FRdBN1TKpgs=
Der Teil in
blau ist was von dd aus über den Standard Fehlerkanal geht und was das erwartete Eingabeformat für die openssl Option -pass stört.
Kommen wir zum Ausdruck
"| base64". Die 128 Bytes an "reinem" Zufall, die das dd Kommando liefert wird mittels Pipe ( | ) an das Kommando "base64" übergeben und damit mit
base64
kodiert.
So, was macht dann der Ausdruck
"$( )" ?
Er nimmt die Ausgabe der Kommandokette und setzt diese als Zeichenkette an der Stelle ein. Will heißen, die base64 kodierte Zufallszahl wird der Option -pass des Kommandos openssl übergeben.
Kommen wir zum Kern des Kommandos:
openssl enc -aes-256-ctr -pass pass:"ZUFALLSZAHL" -nosalt < /dev/zero > /dev/sdX
openssl ist ein Tausendsasser was Verschlüsselung, Zertifikatserstellung und -prüfung angeht. Hier wird das openssl Werkzeug "
enc"
verwendet.
Es verschlüsselt Daten mit einem Algorithmus. Der Algorithmus, der hier ausgewählt ist ist
"aes-256-ctr".
AES ist ein symmetrisches Verschlüsselungsverfahren. Man hat also genau einen Schlüssel zum ver- und entschlüsseln. Dieser Schlüssel ist das was mit der Option -pass übergeben wird - die Zufallszahl.
-nosalt Option sorgt dafür das das Passwort nicht mit einer weiteres Zufallszahl "gesalzen" wird. Das "salzen" verwendet man, damit z.B. die gleiche Passphrase nicht zu exakt dem gleichen verschlüsselten Zeichenkette führt. Denn sonst könnte man ja einfach die verschlüsselten Werte mit bekannten Passwörtern vergleichen und so Rückschlüsse auf das original Passwort treffen. Aber ich schweife ab.
Kommen wir zu:
< /dev/zero
Das bedeutet wir lesen (endlos) NULLEN von einem speziellen Unix "Gerät" das sich zero nennt.
>/dev/sdX
Das ist eine Ausgabeumleitung an ein Speicherlaufwerk.
Vermutlich hat man dir gesagt das man X gegen einen anderen Buchstaben z.B. a, b, c austauschen muss.
/dev/sdX sind Speicherlaufwerke. Das kann deine Festplatte sein, aber auch eine SD Karte oder eine USB Festplatte oder -stick.
Wenn du dieses Kommando auf ein Speicherlaufwerk los lässt sorgt es dafür, dass der Speicher komplett mit (Pseudo-) Zufallszahlen überschrieben wird. Mach das besser nicht mit deiner Systemfestplatte, wenn dir deine Installation lieb ist.

Auf einen USB Stick angewendet entfernt es rückstandsfrei alles was darauf gespeichert war.
Wie komme ich darauf, das es so ist? Nun, zum einen liest die Verschlüsselung von /dev/zero. Es werden also nur Nullen verschlüsselt. Zum anderen wird an keiner Stelle das zufällig generierte Passwort irgendwo sonst gespeichert. Somit sind die Eingaben, egal was es ist, verloren, da man nicht auf das zufällig generierte Passwort zurück schließen kann.
Warum, könntest du nun fragen, macht man so einen komplizierten Lindwurm, wenn man einfach Zufall von /dev/urandom lesen könnte, um damit den Speicher zu überschreiben?
Der Grund erscheint vielleicht zuerst orthodox: Geschwindigkeit
Das AES verschlüsselt die gelesenen Nullen mit dem zufälligen Schlüssel. Das sind keine Zufallszahlen sondern die Ausgabe ist eine Funktion der Eingabe Null und der Eingabe Passwort.
/dev/urandom liefert aber nach besten Möglichkeiten zufällige Werte. Der Unix Kernel treibt da einigen Aufwand damit die generierten Zahlen möglichst nah an Zufallswerten herankommen. Das ist wichtig, da alle kryptographischen Verfahren auf möglichst echte, nicht reproduzierbare Zufallszahlen aufbauen.
Das ist tatsächlich wesentlich aufwändiger und wesentlich langsamer als die AES Verschlüsselung. AES Verschlüsselung besitzt sogar eine Hardwarebeschleunigung in so ziemlich allen CPUs.
Und nun stelle man sich vor, das wir nicht nur 128 Bytes echten Zufall brauchen, sondern gleich ein Giga oder Tera Byte... das kann dauern.
Ich hoffe das hilft dir.
Liebe Grüße,
Klaren