Come utilizzare la riga di comando di gpg per verificare che la passphrase sia corretta


90

Sto cercando di automatizzare i backup con duplicity, ma quando provo il risultato ottengo

gpg: decrittografia della chiave pubblica non riuscita: passphrase non valida

Voglio verificare se la passphrase che sto utilizzando è effettivamente la passphrase associata alla corrispondente chiave segreta gpg, ma non riesco comunque a vedere nelle opzioni della riga di comando gpg che dica "Non crittografare o decrittografare nulla. Conferma solo Sto usando la passphrase corretta. "

Ciò suggerisce che forse sto (ancora una volta) fraintendendo Gnu Privacy Guard. (Ha una predilezione per prendermi in giro finché non piango.)

Ha senso chiedere a gpg di verificare una passphrase? Se é cosi, come?

Risposte:


115

Non esiste un metodo integrato per farlo, ma è abbastanza semplice creare un test che non modifica nulla e ti consente di controllare semplicemente la tua passphrase.

Non hai specificato, quindi presumo che tu stia utilizzando la versione di GnuPG inferiore alla v2 e che tu sia su Linux con Bash come interprete a riga di comando.

Darò il comando qui e di seguito spiegherò cosa fa ciascuna parte - (nota: quanto segue è per la serie GnuPG versione 1, vedi sotto per la serie GnuPG v2)

echo "1234" | gpg --no-use-agent -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

Ciò che fa è innanzitutto inviare del testo con cui firmare a GnuPG echo "1234" |- perché non vogliamo firmare nulla, questo è solo un test, quindi firmeremo del testo inutile.

Successivamente, diciamo a gpg di non usare l'agente chiave con --no-use-agent; questo è importante in seguito perché, a seconda dell'agente chiave, potrebbe non restituire "0" in caso di successo, e questo è tutto ciò che vogliamo fare: verificare il successo della tua passphrase.

Successivamente, diciamo a gpg di mettere i dati firmati direttamente nel /dev/nullfile, il che significa che lo scartiamo e non scriviamo il risultato sul terminale - NOTA: se non stai usando qualche variante di Linux / Unix, questo file potrebbe non esistere. Su Windows potrebbe essere necessario consentire semplicemente di scrivere i dati firmati sullo schermo omettendo semplicemente la -o /dev/nullparte.

Successivamente, specifichiamo la chiave con cui vogliamo eseguire il nostro test utilizzando --local-user 012345. È possibile utilizzare il KeyID per la massima specificità o utilizzare un nome utente, a seconda di quale si adatta meglio alle proprie esigenze.

Successivamente specifichiamo -as, che abilita la modalità di output ASCII, e imposta la modalità contesto per la firma. Il -successivo dice semplicemente a GnuPG di ottenere i dati da firmare dallo standard-in, che è la primissima parte del comando che abbiamo dato echo "1234" |.

Infine, abbiamo && echo "A message that indicates success"- il "&&" significa, se il comando precedente ha avuto successo, stampa questo messaggio. Questo è solo aggiunto per chiarezza, perché il successo del comando sopra sarebbe altrimenti indicato da nessun output.

Spero che sia abbastanza chiaro per farti capire cosa sta succedendo e come puoi usarlo per i test che vuoi fare. Se qualche parte non è chiara o non si capisce, sarò lieto di chiarire. In bocca al lupo!

[MODIFICA] - Se stai usando GnuPG v2, il comando precedente dovrà essere leggermente modificato, in questo modo:

echo "1234" | gpg2 --batch --passphrase-fd 1 -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

Il motivo è che GnuPG v2 si aspetta che la passphrase venga recuperata tramite un agente, quindi non possiamo disabilitare l'uso dell'agente con --no-use-agente avere l'effetto desiderato; invece dobbiamo dire a GnuPG v2 che vogliamo eseguire un processo "batch" e recuperare la passphrase da STDIN (standard in) usando l'opzione --passphrase-fd 1.


11
Questo non funziona con gpg2, poiché richiede sempre un agente. Anche l'agente ncurses in qualche modo viene confuso dall'input convogliato. Quindi ho appena usato gpg --local-user <KEYID> -as. Ciò consente all'agente di chiedere la passphrase e di dirti se era corretta (quindi non fa nulla).
BubuIIC

1
Hai ragione BubullC, per la maggior parte; con una leggera modifica alle opzioni passate puoi avere un risultato simile usando gpg2. Ho modificato la mia risposta per supportare le differenze tra gpg e gpg2.
kylehuff

4
Prova questo per GnuPG 2.1:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry

6
Per me su MacOS 10.12.6, nessuna delle varianti richiede la passphrase e restituisce un messaggio di successo a prescindere.
Stan James

2
--passphrase-fd 1? leggere da stdout? Questo funziona per me: gpg2 -aso - <(echo 1234); echo $?. Utilizzare echo RELOADAGENT | gpg-connect-agentper dimenticare le passphrase.
x-yuri

20

Questa è una riga di comando più breve per verificare se la passphrase è corretta:

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

No, se hai un gpg-agentattivo (che la maggior parte delle persone ha) e hai effettuato l'accesso correttamente, questo non richiederà la passphrase.
foki

5

Per me il modo semplicistico per controllare la passphrase è usare l' gpg --passwdabbreviazione. Prova a cambiare la passphrase e il passaggio è confermare la vecchia passphrase, quindi puoi fare clic su "Annulla" nel prompt della nuova passphrase e ciò mantiene intatta la passphrase.

gpg --passwd <your-user-id>

Questo in effetti è il metodo più semplice che funziona indipendentemente dal fatto che tu abbia l' gpg-agentattivo o meno.
foki

2

Attenzione, non utilizzare l'eco gpg -o /dev/nullcome suggerito dalla risposta principale qui. Ciò farà sì che / dev / null disponga di autorizzazioni non valide e corrompa il /dev/nullfile. È possibile verificare l'autorizzazione del file / dev / null quando si esegue questo comando per dimostrarlo.

Puoi usare questo:

echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null

Ho anche creato uno script bash per questo (questo funziona con Centos 8). Questo script chiederà la passphrase, se non è valida, continuerà a chiedere di inserire una passphrase valida. Inoltre, se inserisci KEY_ID errato o inesistente come argomento, può convalidare anche quello:

#!/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

Esempio di output se nessuna password è memorizzata nella cache in 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:

Esempio di output se viene inserita una passphrase non valida (continuerà a chiedere):

[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:

Esempio di output se viene inserita una passphrase valida:

[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

Quando una passphrase valida viene memorizzata nella cache, la prossima volta che si esegue questo script, non verrà chiesto di immettere la passphrase. Quindi questo script fornisce la soluzione alla tua domanda; "Conferma solo che sto usando la passphrase corretta"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.