Manera segura de pasar contraseña para> 1 progtwigs en bash

Estoy escribiendo un script bash , y necesito pedirle al usuario su contraseña y pasarla a openssl . Mientras que openssl puede leer la contraseña en sí, necesito dos ejecuciones del progtwig y no quiero preguntarle al usuario dos veces. Aquí está el guión:

 cp file{,.old} read -sp 'Enter password. ' PASS; echo export PASS # decode | edit | encode openssl enc -d -aes-256-cbc -k "$PASS" -in file.old | \ sed ... | openssl enc -e -aes-256-cbc -k "$PASS" -out file unset PASS 

Esto no es seguro ya que la contraseña está fácilmente disponible al mirar la línea de command; alguien puede leerlo usando ps , por ejemplo.

openssl puede leer una contraseña de una variable de entorno, así que puedo replace -k "$PASS" con -pass env:PASS , pero aún no es seguro; las variables de entorno de cualquier process se pueden leer libremente (de nuevo, ps puede hacerlo).

Entonces, ¿cómo puedo pasar la contraseña de forma segura a las dos instancias de openssl ?

Pase la contraseña en un descriptor de file separado de la input (dos veces, una para encryption y otra para desencryption). No exportar PASS al medio ambiente.

 read -sp 'Enter password. ' PASS printf '%s\n' "$PASS" | openssl enc -d -aes-256-cbc -kfile /dev/stdin -in file.old | sed ... | { printf '%s\n' "$PASS" | openssl enc -e -aes-256-cbc -kfile /dev/stdin -in /dev/fd/3 -out file; } 3<&0 

Si su sistema no tiene /dev/fd , puede usar el argumento -pass para indicarle a openssl que lea la frase de contraseña de un descriptor de file abierto.

 printf '%s\n' "$PASS" | { printf '%s\n' "$PASS" | openssl enc -d -aes-256-cbc -pass fd:0 -in file.old | tr az AZ | tee /dev/tty | { openssl enc -e -aes-256-cbc -pass fd:3 -out file; } } 3<&0 

Usando Bash se puede hacer sin usar printf '%s\n' "$PASS" asociando una cadena llamada aquí con descriptores de files usando el command Bash builtin exec .

Para get más información, consulte: contraseña del script de shell security de los parameters de la command-line .

 ( # sample code to edit password-protected file with openssl # user should have to enter password only once # password should not become visible using the ps command echo hello > tmp.file #env -i bash --norc # clean up environment set +o history unset PASS || exit 1 read -sp 'Enter password. ' PASS; echo # encrypt file and protect it by given password exec 3<<<"$PASS" openssl enc -e -aes-256-cbc -pass fd:3 -in tmp.file -out file cp file{,.old} # decode | edit | encode exec 3<<<"$PASS" 4<<<"$PASS" openssl enc -d -aes-256-cbc -pass fd:3 -in file.old | sed 's/l/L/g' | openssl enc -e -aes-256-cbc -pass fd:4 -out file exec 3<<<"$PASS" openssl enc -d -aes-256-cbc -pass fd:3 -in file rm -P tmp.file file.old unset PASS ) 

Lo siento, mi respuesta anterior fue del hombre openssl, no de los docs openssl enc.

Esta solución no es una cartera, pero creo que esta solución evita que la contraseña sea visible para ps.

Usando un documento aquí, only openssl ve el text de la contraseña.
Siempre que esté seguro de eliminar el file intermedio, no queda rastro. Tal vez alguien puede ayudar a hacer esto en una tubería y eliminar el file intermedio?

 # cp file{,.old} don't need this anymore since intermediate becomes same read -sp 'Enter password. ' PASS; echo #no need to export, env's are readable, as mentioned # decode into intermediate file openssl <<HERE 2>&1 >/dev/null enc -d -aes-256-cbc -k "$PASS" -in file -out intermediate HERE # edit intermediate # encode intermediate back into file openssl <<HERE 2>&1 >/dev/null enc -e -aes-256-cbc -k "$PASS" -in intermediate -out file HERE unset PASS rm -f intermediate