bash에서> 1 프로그램의 암호를 안전하게 전달하는 방법 수는 있지만 프로그램을 두 번

bash스크립트를 작성 중이며 사용자에게 비밀번호를 요청하고에 전달해야합니다 openssl. openssl암호 자체를 읽을 수는 있지만 프로그램을 두 번 실행해야하며 사용자에게 두 번 묻고 싶지 않습니다. 스크립트는 다음과 같습니다.

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

명령 행을 보면 암호를 쉽게 사용할 수 있으므로 안전하지 않습니다. ps예를 들어 누군가가 그것을 사용하여 읽을 수 있습니다 .

openssl내가 대체 할 수 있도록 환경 변수에서 암호를 읽을 수 -k "$PASS"와 함께 -pass env:PASS,하지만 여전히 안전하지; 모든 프로세스의 환경 변수를 자유롭게 읽을 수 있습니다 (다시 ps할 수 있음).

그렇다면 어떻게 두 openssl인스턴스에 암호를 안전하게 전달할 수 있습니까?



답변

입력과는 별도의 파일 설명자에 암호를 전달하십시오 (두 번, 암호화 및 암호 해제를 위해 한 번). PASS환경으로 내 보내지 마십시오 .

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

시스템에가 없으면 인수/dev/fd사용하여 열린 파일 설명자에서 암호를 읽 도록 지시 할 수 있습니다 .-passopenssl

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

답변

Bash를 printf '%s\n' "$PASS"사용하면 Bash 내장 exec명령을 사용하여 소위 here 문자열을 파일 디스크립터와 연관시켜 사용하지 않고도 수행 할 수 있습니다 .

자세한 정보 는 명령 행 매개 변수의 쉘 스크립트 비밀번호 보안을 참조하십시오 .

(

# 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

)

답변

죄송합니다, 이전 답변은 openssl enc 문서가 아닌 openssl 사람이 작성한 것입니다.

이 솔루션은 파이프 라인이 아니지만이 솔루션으로 인해 비밀번호가 ps에 표시되지 않습니다.

heresl 문서를 사용하면 openssl 만 암호 텍스트를 볼 수 있습니다.
중간 파일을 제거해야한다면 추적이 남아 있지 않습니다. 누군가 파이프 라인 에서이 작업을 수행하고 중간 파일을 제거 할 수 있습니까?

# 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