로 백업을 자동화하려고 duplicity
하지만 결과를 테스트하면
gpg : 공개 키 암호 해독 실패 : 잘못된 암호
사용중인 암호가 실제로 해당 gpg 비밀 키와 연결된 암호인지 확인하고 싶지만 gpg 명령 줄 옵션에서 “아무것도 암호화하거나 암호를 해독하지 마십시오. 확인 만하면됩니다. 올바른 암호를 사용하고 있습니다. “
이것은 내가 Gnu Privacy Guard를 (아직 다시) 오해하고 있음을 시사합니다. (내가 울 때까지 나를 조롱하는 경향이 있습니다.)
gpg에게 암호를 확인하도록 요청하는 것이 합리적입니까? 그렇다면 어떻게?
답변
이 작업을 수행하는 내장 된 방법은 없지만 아무것도 수정하지 않고 암호 만 확인할 수있는 테스트를 만드는 것은 간단합니다.
지정하지 않았으므로 v2 미만의 GnuPG 버전을 사용하고 있으며 명령 줄 인터프리터를 위해 Bash가있는 Linux에 있다고 가정합니다.
여기에서 명령을 내리고 아래에서 각 부분의 기능을 설명하겠습니다. (참고 : 다음은 GnuPG 시리즈 버전 1 용, GnuPG 시리즈 v2 용은 아래 참조)
echo "1234" | gpg --no-use-agent -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"
그게 먼저하는 일은 GnuPG에 서명 할 텍스트를 파이프하는 echo "1234" |
것입니다. 우리는 실제로 아무것도 서명하고 싶지 않기 때문에 테스트 일 뿐이므로 쓸모없는 텍스트에 서명 할 것입니다.
다음으로, 우리는 gpg에게 --no-use-agent
; 이는 나중에 중요합니다. 키 에이전트에 따라 성공시 “0”을 반환하지 않을 수 있으며 이것이 우리가 원하는 전부입니다. 암호의 성공 여부를 확인하십시오.
다음으로 gpg에 서명 된 데이터를 /dev/null
파일에 합니다. 즉 파일을 버리고 결과를 터미널에 쓰지 않습니다. 참고 : Linux / Unix의 일부 변형을 사용하지 않는 경우이 파일이 존재하지 않을 수 있습니다. Windows에서는 -o /dev/null
부분을 생략하여 서명 된 데이터를 화면에 쓰도록 허용해야 할 수도 있습니다 .
다음으로 테스트를 수행 할 키를 지정합니다. --local-user 012345
. 최대의 특이성을 위해 KeyID를 사용하거나 사용자 이름을 사용하여 가장 적합한 제품군을 사용할 수 있습니다.
다음으로 -as
ascii 출력 모드를 활성화하고 서명을위한 컨텍스트 모드를 설정하는 을 지정 합니다. 그만큼-
이후 데이터 만이 표준에서, 우리가 준 명령의 첫 번째 부분입니다있는 서명을 얻기 위해 GnuPG를 알려줍니다 echo "1234" |
.
그리고 마지막으로 && echo "A message that indicates success"
“&&”는 이전 명령이 성공하면이 메시지를 인쇄한다는 의미입니다. 위의 명령이 성공하면 출력이 전혀 표시되지 않기 때문에 명확성을 위해 추가되었습니다.
무슨 일이 일어나고 있는지 이해하고 원하는 테스트를 수행하는 방법을 이해할 수 있기를 바랍니다. 명확하지 않은 부분이 있거나 이해가되지 않는 부분이 있으면 기꺼이 설명하겠습니다. 행운을 빕니다!
[편집]-GnuPG v2를 사용하는 경우 위의 명령을 다음과 같이 약간 수정해야합니다.
echo "1234" | gpg2 --batch --passphrase-fd 1 -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"
그 이유는 GnuPG v2에서는 에이전트를 통해 암호를 검색 할 것으로 예상하므로 에이전트 사용을 비활성화 할 수없고 --no-use-agent
원하는 효과를 얻을 수 없습니다 . 대신 GnuPG v2에 “배치”프로세스를 실행하고 싶다고 알려주고 옵션을 사용하여 STDIN (표준 입력)에서 암호를 검색해야합니다 --passphrase-fd 1
.
답변
다음은 암호가 올바른지 확인하는 더 짧은 명령 줄입니다.
gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK
답변
나를 위해 암호를 확인하는 간단한 방법은 gpg --passwd
속기 를 사용하는 것 입니다. 암호를 변경하려고 시도하고 이전 암호를 확인한 다음 새 암호 프롬프트에서 ‘취소’를 클릭하면 암호가 그대로 유지됩니다.
gpg --passwd <your-user-id>
답변
경고 gpg -o /dev/null
여기에 최고 답변에서 제안한대로 에코 를 사용하지 마십시오 . 이로 인해 / dev / null이 잘못된 권한을 갖게되고/dev/null
파일이 됩니다. 이를 증명하기 위해이 명령을 실행할 때 / dev / null 파일의 권한을 확인할 수 있습니다.
이것을 사용할 수 있습니다 :
echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
나는 또한 이것을 위해 bash 스크립트를 만들었습니다 (이것은 Centos 8에서 작동합니다). 이 스크립트는 암호를 요청하고 유효하지 않은 경우 유효한 암호를 계속 입력하도록 요청합니다. 또한 잘못되었거나 존재하지 않는 KEY_ID를 인수로 입력하면 다음과 같이 유효성을 검사 할 수도 있습니다.
#!/bin/bash
# usage ./gpgcron KEYID | ./gpgcron 2B705B8B6FA943B1
script_path=$(dirname $(realpath -s $0))
script_name=$(basename -- "$0")
GPG_CACHE_BIN="/usr/libexec/gpg-preset-passphrase"
KEY_ID=$1
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
RETVAL=$?
if [[ $RETVAL -ne 0 || -z $KEY_ID ]]; then
echo "Please provide correct KEY_ID. Example ./$script_name KEY_ID"
exit 1
fi
export GPG_TTY=$(tty)
function set_gpg_cachepass {
read -s -p "[$script_name | input]: Enter passphrase to cache into gpg-agent: " PASSPHRASE; echo
$GPG_CACHE_BIN -c $KEY_GRIP <<< $PASSPHRASE
RETVAL=$?
echo "[$script_name | info ]: gpg-preset-passphrase return code: [$RETVAL]"
if [ $RETVAL = 0 ]; then
echo "[$script_name | info ]: A passphrase has been set and cached in gpg-agent"
echo "[$script_name | info ]: Paraphrase set return code: [$RETVAL]"
gpg_validatepass
else
echo "[$script_name | info ]: Unsuccessful error occured: [$RETVAL]"
set_gpg_cachepass
fi
}
function gpg_validatepass {
echo "[$script_name | info ]: Validating passphrase cached in gpg-agent ..."
echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
RETVAL=$?
if [ $RETVAL = 0 ]; then
echo "[$script_name | info ]: OK, valid passphrase has been cached in gpg-agent"
else
echo "[$script_name | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent"
set_gpg_cachepass
fi
}
RES=$(echo "KEYINFO --no-ask $KEY_GRIP Err Pmt Des" | gpg-connect-agent | awk '{ print $7 }')
if [ "$RES" == "1" ]; then
echo "[$script_name | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [$KEY_ID]"
gpg_validatepass
else
echo "[$script_name | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [$KEY_ID]"
set_gpg_cachepass
fi
gpg-agent에 암호가 캐시되지 않은 경우 샘플 출력 :
[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | input]: Enter passphrase to cache into gpg-agent:
유효하지 않은 암호를 입력 한 경우 샘플 출력 (계속 묻습니다) :
[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
gpg: signing failed: Bad passphrase
gpg: signing failed: Bad passphrase
[gpgcron | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent
[gpgcron | input]: Enter passphrase to cache into gpg-agent:
유효한 암호를 입력 한 경우 샘플 출력 :
[gpgcron | input]: Enter passphrase to cache into gpg-agent:
[gpgcron | info ]: gpg-preset-passphrase return code: [0]
[gpgcron | info ]: A passphrase has been set and cached in gpg-agent
[gpgcron | info ]: Paraphrase set return code: [0]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
[gpgcron | info ]: OK, valid passphrase has been cached in gpg-agent
유효한 암호가 캐시되면 다음에이 스크립트를 실행할 때 암호를 입력하라는 메시지가 표시되지 않습니다. 따라서이 스크립트는 귀하의 질문에 대한 해결책을 제공합니다. “올바른 암호를 사용하고 있는지 확인하십시오.”