gpg pide contraseña incluso con --passphrase


65

Espero que el siguiente comando extraiga el archivo gpg sin pedir contraseña:

  gpg --passphrase 1234 file.gpg

Pero pide la contraseña. ¿Por qué?

Esto también tiene el mismo comportamiento:

  gpg --passphrase-file passfile.txt file.gpg

Yo uso Ubuntu con gnome 3, y recuerdo que estaba funcionando en Fedora


1
¿Estás seguro de gpgejecutar el comando correcto, no un alias ni un contenedor? Intenta /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionyset | grep '^.\{0,9\}PG'
F. Hauri

Solo para el registro, si usa la versión anterior de GPG, debería funcionar (en Ubuntu y tal, es el paquete gnupg1. Sin embargo, desaconsejan usarlo a menos que tenga que hacerlo.
Shule

También tenga en cuenta que en GPG 2.x gpg --list-packets --batch myFile.gpgsolicita una frase de contraseña, mientras que no lo hace en GPG 1.x. Ese era mi problema (en un programa que estoy escribiendo), mientras pensaba que tenía su problema (la cosa --list-packets se ejecutó primero, antes de intentar descifrar, y no me di cuenta). Entonces, hice una nueva forma de determinar si los archivos estaban encriptados.
Shule

Respuestas:


58

Estoy exactamente en tu mismo barco (funcionó en Fedora pero no en Ubuntu). Aquí hay un trabajo aparente que descubrí:

echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg

Explicación: Pasar 0hace --passphrase-fdque se lea desde STDIN en lugar de desde un archivo. Por lo tanto, canalizar la frase de contraseña --passphrase-fdaceptará la cadena de contraseña especificada.


16
agregar --batch --yesa lo anterior funcionó para mí.
Ryan Tuck

1
Pero luego tengo un problema, si quiero encriptar los datos que se canalizan a gpg, por ejemplo echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. ¿Cómo puedo solucionar esto?
con-f-use

2
Bueno, con la versión de Ubuntu de gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgparece funcionar.
con-f-use

1
Me estoy poniendo Inappropriate ioctl for devicecon y sin --batchaquí (en gpg (GnuPG) 2.1.18).
Nico Schlömer

2
@RyanGriggs No lo creo. echo "hello" | caty echo "hello"| catambos producen la misma cadena.
Torsten Bronger

36

Actualizado el 04/12/2017. (Agregando --batch para evitar la solicitud de frase de contraseña)

Puede que tenga que agregar la --batchopción:

A partir de la versión 2 de GPG, la opción --batches necesaria para garantizar que no haya avisos ... Ok, mirando eso:

$ gpg --version
gpg (GnuPG) 2.1.18
libgcrypt 1.7.6-beta
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Home: /home/user /.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
        CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, ZIP, ZLIB, BZIP2

Molesto:

$ newdir=$(mktemp -d)
$ cd $newdir
$ seq 1 10 | gpg -c --batch --passphrase 1234 -o file.gpg -
$ ls -ltr
total 4
-rw-r--r-- 1 user  user  91 Dec  4 15:42 file.gpg
$ hd file.gpg 
00000000  8c 0d 04 07 03 02 ea fa  d0 d3 2b 9a ea 06 df d2  |..........+.....|
00000010  4a 01 ed 50 74 ff 27 45  0e 6c 94 74 db e9 8a a5  |J..Pt.'E.l.t....|
00000020  03 9f 67 a0 73 97 e9 15  6b 56 a0 f0 88 71 85 a8  |..g.s...kV...q..|
00000030  dc 41 71 9f fa 3b f9 9d  af ac 80 eb f4 f7 28 19  |.Aq..;........(.|
00000040  9f be 75 47 e6 d8 00 3e  f6 60 f1 00 5e 63 57 ef  |..uG...>.`..^cW.|
00000050  14 c3 4b 20 ff 94 03 03  c1 fc 98                 |..K .......|
0000005b

¡suena bien! Bien ahora:

$ gpg -d --batch --passphrase 1234 file.gpg
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
1
2
3
4
5
6
7
8
9
10

Si bien no -dse proporciona ningún parámetro (la misma sintaxis que la pregunta de SO), los datos descifrados de file.gpgse extraerán a uno nuevo file.

$ gpg --batch --passphrase 1234 file.gpg
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
gpg: AES encrypted data
gpg: encrypted with 1 passphrase

$ ls -ltr
total 8
-rw-r--r-- 1 user  user  91 Dec  4 15:42 file.gpg
-rw-r--r-- 1 user  user  21 Dec  4 15:44 file

$ cat file
1
2
3
4
5
6
7
8
9
10

Esto funciona bien!

$ cd -
$ rm -fR $newdir
$ unset newdir

No recibe la advertencia "gpg: gpg-agent no está disponible en esta sesión", por lo que probablemente tenga la frase de contraseña almacenada en el agente, ¿tal vez?
Asfand Qazi

@AsfandYarQazi No, la frase de contraseña se ingresa en la línea de comando.
F. Hauri

Esta respuesta funcionó para mí. Ubuntu con gpg 1.4.16. El --passphraseparámetro funciona para operaciones por lotes y no solicita una contraseña.
Trevor Sullivan

Puede parecer que esto funciona porque el molesto agente gpg está almacenando en caché la frase de contraseña. Intente reiniciar el sistema por completo y comenzar de nuevo, o ingrese la contraseña incorrecta 5678 (frase de contraseña incorrecta).
Yahermann

@yahermann: Acabo de intentarlo ahora unset GPG_AGENT_INFOe incluso GPG_AGENT_INFO=/dev/null, esto (continúa) funcionando ... ¿Tal vez la alteración $GPG_AGENT_INFOpuede ayudar? (Háganos saber; por favor responda, ¡
editaré

22

Para gpg versión 2.x no necesita usar --batch, solo

--pinentry-mode loopback  

funciona con --passphrase& --passphrase-file, y le permitirá ingresar nueva información, en caso de conflictos de nombre de archivo, por ejemplo:

gpg --pinentry-mode loopback --passphrase-file=file encrypted.gpg

...
File 'encrypted' exists. Overwrite? (y/N)n
Enter new filename: f2

a diferencia de --batcheso fallará rápidamente, diciendo...failed: File exists

(probado en Debian Stable / Stretch's gpg 2.1.18. Este comportamiento de ignorar --passphraseopciones importantes realmente debería ser un error, si aún no lo es)


1
Esto funciona muy bien también en Ubuntu 18.04 Bionic con gpg (GnuPG) 2.2.4
Desensamblador

Esto funciona en MacOS después de instalar gpg con homebrew
Joel

15

Parece que estás usando gpg2. También debes incluir la --batchopción. (Si planea agregar esto a un script, también querrá agregarlo --no-ttyy probablemente --yes).


3
Es 1.4. El uso de --batch no tiene ningún efecto.
Omid

Lo siento, entonces @Nima. No se que decirte. Con GnuPG v1.4 no debería necesitar hacer nada más para pasar la frase de contraseña con ninguna de esas opciones.
rsaw

Buena nota, @rsaw, me ayudó a evitar las solicitudes de contraseña (y la opción echo / STDIN un poco menos elegante).
ryanm

--Batch ayudó incluso en ventanas. woo hoo
Sin

9

para mí, agregar "--no-use-agent" resolvió esto para "gpg (GnuPG) 1.4.16":

date > foo
echo pass > passphrase
# w/o --no-use-agent
> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --symmetric foo
gpg: gpg-agent is not available in this session
gpg: can't query passphrase in batch mode
gpg: error creating passphrase: invalid passphrase
gpg: symmetric encryption of `foo' failed: invalid passphrase


> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --no-use-agent --symmetric foo
> ls -al
total 20
drwxr-xr-x  2 root root 4096 Aug 22 13:59 .
drwx------ 18 root root 4096 Aug 22 13:58 ..
-rw-r--r--  1 root root   30 Aug 22 13:58 foo
-rw-r--r--  1 root root  103 Aug 22 13:59 foo.gpg
-rw-r--r--  1 root root    5 Aug 22 13:58 passphrase

8

Si usa gpg (GnuPG) 2.2.7 Según la página de manual,

--passphrase-fd n

Lea la frase de contraseña del descriptor de archivo n. Solo se leerá la primera línea del descriptor de archivo n. Si usa 0 para n, la frase de contraseña se leerá desde STDIN. Esto solo se puede usar si solo se proporciona una frase de contraseña.

--archivo de contraseña

Lea la frase de contraseña del archivo de archivo. Solo se leerá la primera línea del archivo de archivo. Esto solo se puede usar si solo se proporciona una frase de contraseña. Obviamente, una frase de contraseña almacenada en un archivo es de seguridad cuestionable si otros usuarios pueden leer este archivo. No use esta opción si puede evitarla.

- cadena de frase de contraseña

Use una cadena como frase de contraseña. Esto solo se puede usar si solo se proporciona una frase de contraseña. Obviamente, esto es de seguridad muy cuestionable en un sistema multiusuario. No use esta opción si puede evitarla.

agregar --pinentry-mode loopbackpara trabajar

Tenga en cuenta que desde la Versión 2.0 esta frase de contraseña solo se usa si también se ha dado la opción --batch. Desde la versión 2.1, el modo --pinentry también debe establecerse en loopback.

Por ejemplo:

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in

¿Son necesarias las opciones --batchy --pinentry-mode loopbackpara que funcione cualquier opción --passphrase ...? En v.2.1.18, la página de información dice lo mismo (pero no la página de manual) sobre lote y pinentry necesarios, pero todavía funciona solo con - pinentry ... Si ambos son realmente necesarios para v.2.2.7, entonces las cosas se están volviendo ridículos, los desarrolladores están introduciendo errores graves a propósito
Xen2050

4

Funcionó como magia para mí:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp

de error: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. ¿Algunas ideas?
Gabriel Staples

3
read -sp "Enter passphrase: " pass
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --symmetric -o /path/to/saved/file.jpg.gpg /path/to/file.jpg
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --decrypt -o /path/to/decrypted/file.jpg /path/to/encrypted/file.jpg.gpg

2

has intentado hacer:

gpg --batch --passphrase-fd 0 --decrypt-files *.gpg
gpg --passphrase-fd 0 1234 file.gpg 

Fuente: aquí


1

Creo que un método bastante seguro para pasar la contraseña a la línea de comando es este:

gpg --passphrase-file <(echo password) --batch --output outfile -c file

Lo que esto hará es generar el comando "echo" y pasar un descriptor de archivo como nombre de ruta a gpg (por ejemplo, / dev / fd / 63). gpg leerá la clave desde allí. Mientras tanto, el comando echo debe ejecutarse en paralelo y debe finalizar instantáneamente, dejando la clave en el búfer del fd.

Los beneficios son:

  • El comando gpg no tendrá la contraseña en su línea de comando
  • El eco será de corta duración. De hecho, debería ser casi instantáneo
  • La contraseña nunca residirá en el disco, no habrá un archivo para eliminar y si se interrumpe el comando no habrá sobras

1

No me creerá cuando le diga que en ubuntu gpg intenta preguntarle su contraseña si $ DISPLAY está configurado y lo toma de la línea de comando --contraseña si lo desarma. Esto funciona como se esperaba:

DISPLAY=    gpg --symmetric --passphrase pass --batch

Solo otro ejemplo de sobre ingeniería, supongo.


1

Aquí hay un enlace a una respuesta de stackoverflow que puede ser de mayor ayuda; Tengo un proyecto que hace descifrado / cifrado masivo, y debido a que GnuPG es muy estricto con las frases de contraseña, aprendí de la manera difícil que --passphrasesolo funciona en raras ocasiones. En cambio, considere la --passphrase-fdopción para ser más confiable.

Este script hace un uso adecuado de la --passphrase -fdopción y se ha probado públicamente a través de Travis-CI, donde puede encontrar registros de él en acción.

Ahora no voy a publicar enlaces a una respuesta sin proporcionar un código de ejemplo aquí, así que aquí hay un script "independiente" actualizado con el que puedes jugar:

#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass="/path/to/passphrase.file"
Var_gpg_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
if [ -f "${Var_pass}" ]; then
    exec ${Var_fd}<"${Var_pass}"
else
    exec ${Var_fd}<(echo "${Var_pass}")
fi
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-

Si bien lo anterior no es tan elegante como la protección vinculada en GitHub, debería ser aún más funcional que la respuesta vinculada al comienzo de esta publicación.

Feliz pirateo.


1

Como se menciona en man gpg, se puede usar la siguiente opción

- modo modo pinentry Establece el modo pinentry en modo. Los valores permitidos para el modo son:

          default
                 Use the default of the agent, which is ask.

          ask    Force the use of the Pinentry.

          cancel Emulate use of Pinentry's cancel button.

          error  Return a Pinentry error (``No Pinentry'').

          loopback
                 Redirect Pinentry queries to the caller.  Note that in contrast to Pinentry the user is not prompted again if he enters a bad password.

Entonces, el comportamiento predeterminado de gpg es solicitar al usuario la frase de contraseña, si cambia este modo de agente de usuario a "--pinentry-mode loopback", funciona perfectamente bien. comando completo

gpg --pinentry-mode loopback --passphrase <passphrase> -d <file to decrypt>

0

Un método simple que encontré trabajando en una máquina Linux es: 1) importar clave a gpg: => shell> gpg —importar private_key.key

2) descifrar dando el nombre del archivo de salida: => shell> gpg —output -d

2.1) Dar el comando anterior le pedirá que ingrese la paráfrasis. Ingrese la paráfrasis y descifrará el archivo gpg.


0
gpg2 -se --passphrase yourpassword --batch --yes -r user@example.com filename

1
sería bueno si pudieras explicar por qué esto debería solucionar el problema
Zanna

1
Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo la pregunta para los lectores en el futuro, ¡no solo la persona que pregunta ahora! Por favor, editar su respuesta para agregar explicación y dar una indicación de lo que se aplican limitaciones y supuestos.
Toby Speight

0

Poner al final de ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Poner al final del archivo (quizás nuevo) ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

Y luego ejecuta este comando:

echo RELOADAGENT | gpg-connect-agent

Ahora puede ejecutar esto sin pedir contraseña:

echo "$1" | gpg2 --trust-model always --clearsign --batch --no-tty --quiet --no-verbose --yes -u $2 --digest-algo SHA512
--s2k-digest-algo SHA512 --passphrase "$3"

Donde $ 1 es el texto a cifrar, $ 2 es la ID de usuario y $ 3 la contraseña.

Nota: No recuerdo por qué funciona, pero funciona. Si conoce los detalles, edítelos e insértelos aquí.


0

para Ubuntu 18.04 esto funcionó para mí

cifrar:

pass='123'

gpg -c --batch --passphrase "$pass" some-file.tgz

descifrar:

gpg some-file.tgz.gpg
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.