Wie man die gpg-Befehlszeile verwendet, um die Passphrase zu überprüfen, ist korrekt

86

Ich versuche, Backups mit zu automatisieren duplicity, aber wenn ich das Ergebnis teste, bekomme ich

gpg: Entschlüsselung des öffentlichen Schlüssels fehlgeschlagen: falsche Passphrase

Ich möchte überprüfen, ob die von mir verwendete Passphrase tatsächlich die Passphrase ist, die dem entsprechenden gpg-Geheimschlüssel zugeordnet ist, aber ich kann in den gpg-Befehlszeilenoptionen ohnehin nicht sehen, dass "nichts verschlüsseln oder entschlüsseln". Bestätigen Sie einfach Ich benutze die richtige Passphrase. "

Dies deutet darauf hin, dass ich Gnu Privacy Guard (noch einmal) falsch verstehe. (Es hat eine Vorliebe, mich zu verspotten, bis ich weine.)

Ist es sinnvoll, gpg zu bitten, eine Passphrase zu überprüfen? Wenn das so ist, wie?

Seltsames Denken
quelle

Antworten:

113

Es gibt keine eingebaute Methode, aber es ist einfach genug, einen Test zu erstellen, der nichts ändert und es Ihnen ermöglicht, nur Ihre Passphrase zu überprüfen.

Sie haben nichts angegeben, daher gehe ich davon aus, dass Sie eine GnuPG-Version unter Version 2 verwenden und unter Linux mit Bash für Ihren Befehlszeileninterpreter arbeiten.

Ich werde den Befehl hier geben und unten werde ich erklären, was jeder Teil tut - (Hinweis: Das Folgende ist für GnuPG-Serie Version 1, siehe unten für GnuPG-Serie v2)

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

Dazu müssen Sie zunächst einen Text an GnuPG senden, mit echo "1234" |dem Sie ihn signieren möchten. Da wir eigentlich nichts signieren möchten, ist dies nur ein Test. Wir werden also nutzlosen Text signieren.

Als nächstes weisen wir gpg an, den Schlüsselagenten nicht mit zu verwenden --no-use-agent. Dies ist später wichtig, da abhängig von Ihrem Schlüsselagenten bei Erfolg möglicherweise nicht "0" zurückgegeben wird. Dies ist alles, was wir tun möchten - den Erfolg Ihrer Passphrase überprüfen.

Als Nächstes weisen wir gpg an, die signierten Daten direkt in die /dev/nullDatei einzufügen. Dies bedeutet, dass wir sie verwerfen und das Ergebnis nicht in das Terminal schreiben. HINWEIS: Wenn Sie keine Variante von Linux / Unix verwenden, ist diese Datei möglicherweise nicht vorhanden. Unter Windows müssen Sie möglicherweise nur zulassen, dass die signierten Daten auf den Bildschirm geschrieben werden, indem Sie das -o /dev/nullTeil einfach weglassen .

Als nächstes geben wir den Schlüssel an, mit dem wir unseren Test durchführen möchten --local-user 012345. Sie können die KeyID für maximale Spezifität verwenden oder einen Benutzernamen verwenden, je nachdem, was Ihren Anforderungen am besten entspricht.

Als nächstes geben wir an -as, wodurch der ASCII-Ausgabemodus aktiviert und der Kontextmodus für das Signieren festgelegt wird. Im -Anschluss wird GnuPG lediglich angewiesen, die zu signierenden Daten vom Standard-In zu erhalten. Dies ist der allererste Teil des von uns erteilten Befehls echo "1234" |.

Und zuletzt haben wir && echo "A message that indicates success"- das "&&" bedeutet, wenn der vorherige Befehl erfolgreich war, drucken Sie diese Nachricht. Dies wird nur zur Verdeutlichung hinzugefügt, da der Erfolg des obigen Befehls ansonsten durch überhaupt keine Ausgabe angezeigt würde.

Ich hoffe, das ist klar genug, damit Sie verstehen, was los ist und wie Sie es verwenden können, um die Tests durchzuführen, die Sie durchführen möchten. Wenn ein Teil unklar ist oder Sie nicht verstehen, werde ich gerne klären. Viel Glück!

[BEARBEITEN] - Wenn Sie GnuPG v2 verwenden, muss der obige Befehl wie folgt geringfügig geändert werden:

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

Der Grund dafür ist, dass GnuPG v2 erwartet, dass die Passphrase über einen Agenten abgerufen wird. Daher können wir die Verwendung des Agenten mit nicht deaktivieren --no-use-agentund haben den gewünschten Effekt. Stattdessen müssen wir GnuPG v2 mitteilen, dass wir einen "Batch" -Prozess ausführen und die Passphrase mithilfe der Option aus STDIN (Standard in) abrufen möchten --passphrase-fd 1.

Kylehuff
quelle
11
Dies funktioniert nicht mit gpg2, da immer ein Agent erforderlich ist. Auch der ncurses-Agent wird durch die Pipeline-Eingabe irgendwie verwirrt. Also habe ich gerade benutzt gpg --local-user <KEYID> -as. Dadurch kann der Agent nur nach der Passphrase fragen und Ihnen mitteilen, ob diese korrekt war (dann wird nichts unternommen).
BubuIIC
1
Sie sind größtenteils korrekt BubullC; Mit geringfügigen Änderungen an den übergebenen Optionen können Sie mit gpg2 ein ähnliches Ergebnis erzielen. Ich habe meine Antwort geändert, um die Unterschiede zwischen gpg und gpg2 zu unterstützen.
Kylehuff
4
Versuchen Sie dies für GnuPG 2.1:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry
6
Unter MacOS 10.12.6 fordert keine der Variationen eine Passphrase auf und gibt trotzdem eine Erfolgsmeldung zurück.
Stan James
1
--passphrase-fd 1? von stdout lesen? Das funktioniert bei mir : gpg2 -aso - <(echo 1234); echo $?. Verwenden Sie echo RELOADAGENT | gpg-connect-agentdiese Option, um Passphrasen zu vergessen.
X-Yuri
20

Dies ist eine kürzere Befehlszeile, um zu überprüfen, ob die Passphrase in Ordnung ist:

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

Für mich besteht die einfachste Möglichkeit, die Passphrase zu überprüfen, darin, eine gpg --passwdKurzschrift zu verwenden . Es wird versucht, die Passphrase zu ändern. Der Schritt besteht darin, die alte Passphrase zu bestätigen. Anschließend können Sie an der neuen Passphrase-Eingabeaufforderung auf "Abbrechen" klicken. Dadurch bleibt die Passphrase erhalten.

gpg --passwd <your-user-id>
Lei Zhao
quelle
2

Warnung Verwenden Sie kein Echo, gpg -o /dev/nullwie in der Top-Antwort hier vorgeschlagen. Dies führt dazu, dass / dev / null eine ungültige Berechtigung hat und die /dev/nullDatei beschädigt wird. Sie können die Berechtigung der Datei / dev / null überprüfen, wenn Sie diesen Befehl ausführen, um dies zu beweisen.

Sie können dies verwenden:

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

Ich habe auch ein Bash-Skript dafür erstellt (Dieses funktioniert mit Centos 8). Dieses Skript fragt nach der Passphrase. Wenn diese ungültig ist, werden Sie weiterhin aufgefordert, eine gültige Passphrase einzugeben. Auch wenn Sie eine falsche oder nicht vorhandene KEY_ID als Argument eingeben, kann dies ebenfalls überprüft werden:

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

Beispielausgabe, wenn in gpg-agent kein Passwort zwischengespeichert ist:

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

Beispielausgabe, wenn eine ungültige Passphrase eingegeben wird (es wird immer wieder gefragt):

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

Beispielausgabe bei Eingabe einer gültigen Passphrase:

[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

Wenn eine gültige Passphrase zwischengespeichert wird, werden Sie beim nächsten Ausführen dieses Skripts nicht aufgefordert, eine Passphrase einzugeben. Dieses Skript bietet also die Lösung für Ihre Frage. "Bestätigen Sie einfach, dass ich die richtige Passphrase verwende."

MaXi32
quelle