Passwörter als Kommandozeilenparameter sind immer ein potentielles Sicherheitsleck, da sie in der Ausgabe von ps
, top
, htop
, etc. für alle Nutzer eines Systems zu sehen sind.openssl
erlaubt die Angabe eines Dateideskriptors als Passwortquelle, in Kombination mit einem FIFO und bash
-I/O-Umleitung können wir programmatisch das Erscheinen des Passwortes in den Systeminformationen vermeiden.
- Einen FIFO erzeugen
mkfifo fifoname
- Den Dateideskriptor 9 auf den FIFO umleiten
exec 9<>fifoname
- Das Passwort in den FIFO schreiben
echo $pass >&9
- openssl aus dem Dateideskriptor 9 das Passwort lesen lassen mit dem Parameter
-pass "fd:9"
- Aufräumen, d.h. den Dateideskriptor 9 wieder freigeben, den FIFO entfernen
exec 9&- rm $PWD/fifoname
Zusammenfassen können wir das in zwei Funktionen zum Ver- und Entschlüsseln von übergebenen Daten:
openssl_encrypt() { localpass="$1"localtext="$2"localfifo="$(rand_str 10 true)" /usr/bin/mkfifo $PWD/$fifoexec 9<>$PWD/$fifoecho $pass >&9 echo"$text" | openssl bf -e -a -salt -pass "fd:9"status=$?exec 9<&- exec 9>&- rm $PWD/$fiforeturn $status }
openssl_decrypt() { localpass="$1"localtext="$2"localfifo="$(rand_str 10 true)" /usr/bin/mkfifo $PWD/$fifoexec 9<>"$PWD/$fifo"echo $pass >&9 echo"$text" | openssl bf -d -a -salt -pass "fd:9"status=$?exec 9<&- exec 9>&- rm $PWD/$fiforeturn $status }
Die rand_str Funktion stammt aus der Shell-Bibliothek von Chris F.A. Johnson:
rand_str() { locallength=$1localascii=$2localresult="" [ -z "$ascii" ] && ascii=true localrange=94 localoffset=32 if [ "$ascii" == "true" ]; thenrange=61 offset=65 fifor i in $(seq 1 1 $length); doresult+="$(printf "%03d" "$(dec2oct $(($RANDOM % $range + $offset)))")"doneecho -e "$result" } dec2oct() { localquotient=$1localremainder= localoctal= while [ $quotient -ne 0 ] doremainder=$(( $quotient % 8 )) octal="$remainder$octal"quotient=$(( $quotient / 8 )) doneecho $octal }