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


88

로 백업을 자동화하려고 duplicity하지만 결과를 테스트하면

gpg : 공개 키 암호 해독 실패 : 잘못된 암호

사용중인 암호가 실제로 해당 gpg 비밀 키와 연결된 암호인지 확인하고 싶지만 gpg 명령 줄 옵션에서 "아무것도 암호화하거나 암호를 해독하지 마십시오. 확인 만하면됩니다. 올바른 암호를 사용하고 있습니다. "

이것은 내가 Gnu Privacy Guard를 (아직 다시) 오해하고 있음을 시사합니다. (내가 울 때까지 나를 조롱하는 경향이 있습니다.)

gpg에게 ​​암호를 확인하도록 요청하는 것이 합리적입니까? 그렇다면 어떻게?

답변:


114

이 작업을 수행하는 내장 된 방법은 없지만 아무것도 수정하지 않고 암호 만 확인할 수있는 테스트를 만드는 것은 간단합니다.

지정하지 않았으므로 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.


11
항상 에이전트가 필요하므로 gpg2에서는 작동하지 않습니다. 또한 ncurses 에이전트는 파이프 입력에 의해 어떻게 든 혼란스러워집니다. 그래서 방금 gpg --local-user <KEYID> -as. 이렇게하면 상담원이 암호를 요청하고 올바른지 알려줍니다 (그런 다음 아무 작업도 수행하지 않음).
BubuIIC

1
대부분의 경우 올바른 BubullC입니다. 전달 된 옵션을 약간 수정하면 gpg2를 사용하여 비슷한 결과를 얻을 수 있습니다. gpg와 gpg2의 차이점을 지원하기 위해 내 대답을 수정했습니다.
kylehuff 2013 년

4
GnuPG 2.1을 위해 이것을 시도하십시오 :gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry

6
MacOS 10.12.6에서 나를 위해 어떤 변형도 암호를 요구하지 않고 성공 메시지를 반환합니다.
Stan James

1
--passphrase-fd 1? stdout에서 읽었습니까? 이것은 나를 위해 작동합니다 : gpg2 -aso - <(echo 1234); echo $?. echo RELOADAGENT | gpg-connect-agent암호를 잊어 버리는 데 사용 합니다.
x-yuri

20

다음은 암호가 올바른지 확인하는 더 짧은 명령 줄입니다.

gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK

3

나를 위해 암호를 확인하는 간단한 방법은 gpg --passwd속기 를 사용하는 것 입니다. 암호를 변경하려고 시도하고 이전 암호를 확인한 다음 새 암호 프롬프트에서 '취소'를 클릭하면 암호가 그대로 유지됩니다.

gpg --passwd <your-user-id>

2

경고 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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.