Cómo usar la línea de comandos de gpg para verificar que la contraseña sea correcta


88

Estoy intentando automatizar las copias de seguridad con duplicity, pero cuando pruebo el resultado, obtengo

gpg: falló el descifrado de la clave pública: frase de contraseña incorrecta

Quiero comprobar si la frase de contraseña que estoy usando es en realidad la frase de contraseña asociada con la clave secreta de gpg correspondiente, pero no puedo ver de todos modos en las opciones de la línea de comandos de gpg decir "No cifrar ni descifrar nada. Solo confirme Estoy usando la contraseña correcta ".

Esto sugiere que tal vez estoy (una vez más) malinterpretando a Gnu Privacy Guard. (Tiene predilección por burlarse de mí hasta que lloro).

¿Tiene sentido pedirle a gpg que verifique una contraseña? ¿Si es así, cómo?

Respuestas:


114

No hay un método incorporado para hacer esto, pero es lo suficientemente simple como para crear una prueba que no modifica nada y le permite simplemente verificar su frase de contraseña.

No lo especificó, así que asumiré que está usando la versión GnuPG menor que v2 y está en Linux con Bash para su intérprete de línea de comandos.

Daré el comando aquí y a continuación explicaré qué hace cada parte - (nota: lo siguiente es para la serie GnuPG versión 1, ver más abajo para 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"

Lo que hace es primero, canalizar algo de texto para firmar en GnuPG echo "1234" |, porque realmente no queremos firmar nada, esto es solo una prueba, por lo que firmaremos un texto inútil.

A continuación, le decimos a gpg que no use el agente clave con --no-use-agent; esto es importante más adelante porque, dependiendo de su agente clave, es posible que no devuelva "0" en caso de éxito, y eso es todo lo que queremos hacer: verificar el éxito de su frase de contraseña.

A continuación, le decimos a gpg que coloque los datos firmados directamente en el /dev/nullarchivo, lo que significa que lo descartamos y no escribimos el resultado en la terminal. NOTA: si no está utilizando alguna variante de Linux / Unix, es posible que este archivo no exista. En Windows, puede que tenga que permitirle que escriba los datos firmados en la pantalla simplemente omitiendo la -o /dev/nullparte.

A continuación, especificamos la clave con la que queremos hacer nuestra prueba usando --local-user 012345. Puede usar KeyID para una máxima especificidad, o usar un nombre de usuario, lo que mejor se adapte a sus necesidades.

A continuación, especificamos -as, que habilita el modo de salida ascii y establece el modo de contexto para la firma. A -continuación, solo le dice a GnuPG que obtenga los datos para firmar desde la entrada estándar, que es la primera parte del comando que le dimos echo "1234" |.

Y por último, tenemos && echo "A message that indicates success"- el "&&" significa, si el comando anterior fue exitoso, imprima este mensaje. Esto solo se agrega para mayor claridad, porque de lo contrario, el éxito del comando anterior se indicaría sin ningún resultado.

Espero que sea lo suficientemente claro para que comprenda lo que está sucediendo y cómo puede usarlo para realizar las pruebas que desea hacer. Si alguna parte no está clara o no la entiende, estaré encantado de aclarar. ¡Buena suerte!

[EDITAR] - Si está utilizando GnuPG v2, el comando anterior deberá modificarse ligeramente, así:

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

La razón es que GnuPG v2 espera que la frase de contraseña se recupere a través de un agente, por lo que no podemos deshabilitar el uso del agente con --no-use-agenty tener el efecto deseado; en su lugar, necesitamos decirle a GnuPG v2 que queremos ejecutar un proceso "por lotes" y recuperar la frase de contraseña de STDIN (estándar en) usando la opción --passphrase-fd 1.


11
Esto no funciona con gpg2, ya que siempre requirió un agente. Además, el agente ncurses de alguna manera se confunde con la entrada canalizada. Así que solo usé gpg --local-user <KEYID> -as. Esto solo permite que el agente solicite la contraseña y le diga si fue correcta (luego no hace nada).
BubuIIC

1
Estás en lo correcto BubullC, en su mayor parte; con una ligera modificación de las opciones aprobadas, puede obtener un resultado similar usando gpg2. Modifiqué mi respuesta para admitir las diferencias entre gpg y gpg2.
kylehuff

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

6
Para mí, en MacOS 10.12.6, ninguna de las variaciones solicita una frase de contraseña y devuelve un mensaje de éxito independientemente.
Stan James

1
--passphrase-fd 1? leer desde stdout? Esto funciona para mí: gpg2 -aso - <(echo 1234); echo $?. Úselo echo RELOADAGENT | gpg-connect-agentpara olvidar frases de contraseña.
x-yuri

20

Esta es una línea de comando más corta para verificar si la contraseña es correcta:

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

3

Para mí, la forma simplista de verificar la contraseña es usar gpg --passwdtaquigrafía. Intenta cambiar la frase de contraseña y el paso es confirmar la frase de contraseña anterior, y luego puede hacer clic en 'cancelar' en el indicador de la nueva frase de contraseña y esto mantiene la frase de contraseña intacta.

gpg --passwd <your-user-id>

2

Advertencia: no use el eco gpg -o /dev/nullcomo lo sugiere la respuesta principal aquí. Esto hará que / dev / null tenga un permiso no válido y corrompa el /dev/nullarchivo. Puede verificar el permiso del archivo / dev / null al ejecutar este comando para demostrarlo.

Puedes usar esto:

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

También creé un script bash para esto (este funciona con Centos 8). Este script le pedirá una contraseña, si no es válida, seguirá pidiendo que introduzca una contraseña válida. Además, si ingresa un KEY_ID incorrecto o no existente como argumento, también puede validarlo:

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

Salida de muestra si no hay ninguna contraseña almacenada en caché en 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:

Salida de muestra si se ingresa una frase de contraseña no válida (seguirá preguntando):

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

Salida de muestra si se ingresa una contraseña válida:

[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

Cuando se almacena en caché una contraseña válida, la próxima vez que ejecute este script, no le pedirá que ingrese la contraseña. Entonces este script da la solución a su pregunta; "Solo confirma que estoy usando la frase de contraseña correcta"

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.