[gnupg] gpg 명령 줄을 사용하여 암호가 올바른지 확인하는 방법

로 백업을 자동화하려고 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를 사용하거나 사용자 이름을 사용하여 가장 적합한 제품군을 사용할 수 있습니다.

다음으로 -asascii 출력 모드를 활성화하고 서명을위한 컨텍스트 모드를 설정하는 을 지정 합니다. 그만큼- 이후 데이터 만이 표준에서, 우리가 준 명령의 첫 번째 부분입니다있는 서명을 얻기 위해 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

유효한 암호가 캐시되면 다음에이 스크립트를 실행할 때 암호를 입력하라는 메시지가 표시되지 않습니다. 따라서이 스크립트는 귀하의 질문에 대한 해결책을 제공합니다. “올바른 암호를 사용하고 있는지 확인하십시오.”


답변