gpg chiede la password anche con --passphrase


65

Mi aspetto che il seguente comando estragga il file gpg senza chiedere la password:

  gpg --passphrase 1234 file.gpg

Ma chiede la password. Perché?

Anche questo ha lo stesso comportamento:

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

Uso Ubuntu con gnome 3 e ricordo che funzionava in Fedora


1
Sei sicuro di gpgeseguire il comando giusto, non un alias né un wrapper? Provate /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versioneset | grep '^.\{0,9\}PG'
F. Hauri

Solo per la cronaca, se usi la vecchia versione di GPG, dovrebbe funzionare (su Ubuntu e simili, è il pacchetto gnupg1. Tuttavia, scoraggiano l'uso a meno che non sia necessario.
Shule

Si noti inoltre che in GPG 2.x gpg --list-packets --batch myFile.gpgrichiede una passphrase, mentre non in GPG 1.x. Quello era il mio problema (in un programma che sto scrivendo), mentre pensavo di avere il tuo problema (la cosa --list-packets è stata eseguita per prima, prima di provare a decifrare, e non me ne sono accorta). Quindi, ho creato un nuovo modo per determinare se i file erano crittografati.
Shule

Risposte:


58

Sono nella tua stessa barca (ha funzionato su Fedora ma non su Ubuntu). Ecco un apparente lavoro in giro che ho scoperto:

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

Spiegazione: Il passaggio 0causa la --passphrase-fdlettura da STDIN anziché da un file. Pertanto, il piping della passphrase --passphrase-fdaccetterà la stringa di password specificata.


16
aggiungendo --batch --yesa quanto sopra ha funzionato per me.
Ryan Tuck,

1
Ma poi ho un problema, se voglio crittografare i dati che vengono reindirizzati in gpg, ad es echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Come lo risolvo?
con-f-use

2
Bene, con la versione Ubuntu di gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgsembra funzionare.
con-f-use

1
Sto arrivando Inappropriate ioctl for devicecon e senza --batchqui (su gpg (GnuPG) 2.1.18).
Nico Schlömer,

2
@RyanGriggs Non credo. echo "hello" | cated echo "hello"| catentrambi producono la stessa stringa.
Torsten Bronger,

36

Aggiornato il 04/12/2017. (Aggiunta di --batch per impedire il prompt passphrase)

Potrebbe essere necessario aggiungere --batchun'opzione:

Dalla versione 2 di GPG, l'opzione --batchè necessaria per garantire nessun prompt ... Ok, guardando che:

$ 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

Provando:

$ 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

suona bene! Bene ora:

$ 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

Sebbene non -dvenga fornito alcun parametro (stessa sintassi della domanda di SO), i dati decrittati da file.gpgverranno estratti in un nuovo 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

Questo funziona bene!

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

Non viene visualizzato l'avviso "gpg: gpg-agent non è disponibile in questa sessione", quindi probabilmente hai la passphrase memorizzata nell'agente, forse?
Asfand Qazi,

@AsfandYarQazi No, la passphrase viene inserita nella riga di comando.
F. Hauri,

Questa risposta ha funzionato per me. Ubuntu con gpg 1.4.16. Il --passphraseparametro funziona per le operazioni batch e non richiede una password.
Trevor Sullivan,

Questo può sembrare funzionare perché il fastidioso agente gpg sta memorizzando nella cache la passphrase. Prova a riavviare completamente il sistema e a ricominciare da capo, oppure a inserire erroneamente --passphrase 5678 (passphrase errata).
Yahermann,

@yahermann: Ho provato subito dopo unset GPG_AGENT_INFOe anche GPG_AGENT_INFO=/dev/null, questo (continua) a funzionare ... Forse il disagio $GPG_AGENT_INFOpuò aiutare !? (Facci sapere; ti preghiamo di rispondere, lo modificherò se questo aiuto!)
F. Hauri

22

Per la versione 2.x di gpg non è necessario utilizzare --batch, solo

--pinentry-mode loopback  

funziona con --passphrase& --passphrase-filee ti consentirà di inserire nuove informazioni, ad esempio in caso di conflitti di nome file:

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

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

a differenza di --batchciò fallirà rapidamente, dicendo...failed: File exists

(testato su gpg Debian Stable / Stretch 2.1.18. Questo comportamento di ignorare --passphraseopzioni importanti dovrebbe davvero essere un bug, se non lo è già)


1
Funziona bene anche su Ubuntu 18.04 Bionic con gpg (GnuPG) 2.2.4
Disassemblatore

Funziona su MacOS dopo aver installato gpg con homebrew
Joel il

15

Sembra che tu stia usando gpg2. Devi anche inserire l' --batchopzione. (Se hai intenzione di aggiungere questo a uno script, ti consigliamo di aggiungere anche --no-ttye probabilmente --yes.)


3
È 1.4. l'uso di --batch non ha alcun effetto.
Omid

Scusa quindi @Nima. Non so cosa dirti. Con GnuPG v1.4 non dovresti fare nient'altro per passare la passphrase con una di queste opzioni.
visto il

Una buona nota, @rsaw, mi ha aiutato a prevenire le richieste di password (e l'opzione echo / STDIN leggermente meno elegante).
Ryan

--batch ha aiutato anche in Windows. woo hoo.
Sin il

9

per me, aggiungendo "--no-use-agent" risolto questo problema per "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

Se si utilizza gpg (GnuPG) 2.2.7 Secondo la pagina man,

--passphrase-fd n

Leggi la passphrase dal descrittore di file n. Solo la prima riga verrà letta dal descrittore di file n. Se si utilizza 0 per n, la passphrase verrà letta da STDIN. Questo può essere usato solo se viene fornita una sola passphrase.

--passphrase-file file

Leggi la passphrase dal file file. Solo la prima riga verrà letta dal file file. Questo può essere usato solo se viene fornita una sola passphrase. Ovviamente, una passphrase memorizzata in un file è di dubbia sicurezza se altri utenti possono leggere questo file. Non utilizzare questa opzione se puoi evitarlo.

--passphrase string

Usa la stringa come passphrase. Questo può essere usato solo se viene fornita una sola passphrase. Ovviamente, si tratta di una sicurezza molto discutibile su un sistema multiutente. Non utilizzare questa opzione se puoi evitarlo.

aggiungere --pinentry-mode loopbackper funzionare

Si noti che dalla versione 2.0 questa passphrase viene utilizzata solo se è stata fornita anche l'opzione --batch. Dalla versione 2.1 anche la modalità --pinentry deve essere impostata su loopback.

Per esempio:

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

Sono necessarie entrambe le opzioni --batche --pinentry-mode loopbackper far funzionare qualsiasi opzione --passphrase ...? Su v.2.1.18 la pagina delle informazioni dice la stessa cosa (ma non la pagina man) sul batch e la pinentry necessari, ma funziona ancora solo con --pinentry ... Se entrambi sono realmente necessari per la v.2.2.7 allora le cose stanno diventando ridicoli, gli sviluppatori stanno introducendo apposta gravi bug
Xen2050

4

Per me ha funzionato come per magia:

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

errore: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Qualche idea?
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

hai provato a fare:

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

Fonte: qui


1

Penso che un metodo abbastanza sicuro per passare la password alla riga di comando sia questo:

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

Ciò che farà sarà generare il comando "echo" e passare un descrittore di file come nome di percorso a gpg (ad esempio / dev / fd / 63). gpg leggerà quindi la chiave da lì. Nel frattempo, il comando echo dovrebbe essere eseguito in parallelo e dovrebbe terminare all'istante, lasciando la chiave sul buffer di fd.

I vantaggi sono:

  • Il comando gpg non avrà la password sulla sua riga di comando
  • L'eco avrà vita breve. In effetti, dovrebbe essere quasi istantaneo
  • La password non risiederà mai sul disco, non ci sarà un file da cancellare e se il comando viene interrotto non ci saranno residui

1

Non mi crederai quando ti dico che su Ubuntu gpg prova a chiedere la tua password se $ DISPLAY è impostato e lo prende dalla riga di comando - password se la disattivi. Funziona come previsto:

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

Solo un altro esempio di ingegneria eccessiva credo.


1

Ecco un link a una risposta stackoverflow che forse di ulteriore assistenza; Ho un progetto che esegue la decrittografia / crittografia di massa e, dato che GnuPG è molto severo sulle passphrase, ho imparato a mie spese che --passphrasefunziona solo in rare occasioni. Invece considera l' --passphrase-fdopzione più affidabile.

Questo script fa un uso corretto--passphrase -fd dell'opzione ed è stato testato pubblicamente tramite Travis-CI, dove è possibile trovarne i log in azione.

Ora non ho intenzione di pubblicare link a una risposta senza fornire qui un codice di esempio, quindi ecco uno script "stand alone" aggiornato con cui puoi giocare:

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

Anche se quanto sopra non è elegante come la protezione collegata su GitHub, dovrebbe essere anche più funzionale della risposta collegata all'inizio di questo post.

Happy hacking.


1

Come menzionato in man gpg è possibile usare la seguente opzione

--pinentry-mode mode Imposta la modalità pinentry su mode. I valori consentiti per la modalità sono:

          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.

Quindi, il comportamento predefinito di gpg è richiedere all'utente la passphrase, se cambia questa modalità agente utente in "--pinentry-mode loopback" Funziona perfettamente. comando completo

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

0

Un metodo semplice che ho trovato lavorando su una macchina linux è: 1) import key to gpg: => shell> gpg —import private_key.key

2) decodifica fornendo il nome del file di output: => shell> gpg —output -d

2.1) Dare il comando sopra ti chiederà di inserire la parafrasi. Inserisci la parafrasi e decodificherà il file gpg.


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

1
sarebbe bello se tu potessi spiegare perché questo dovrebbe risolvere il problema
Zanna,

1
Sebbene questo frammento di codice possa risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, non solo per la persona che chiede ora! Si prega di modificare la risposta di aggiungere una spiegazione, e dare un'indicazione di ciò si applicano le limitazioni e le assunzioni.
Toby Speight,

0

Metti alla fine di ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Inserisci alla fine del file (forse nuovo) ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

E quindi eseguire questo comando:

echo RELOADAGENT | gpg-connect-agent

Ora puoi eseguirlo senza chiedere la password:

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"

Dove $ 1 è il testo da crittografare, $ 2 è l'ID utente e $ 3 la password.

Nota: non ricordo perché funziona, ma funziona. Se conosci i dettagli, modifica e inserisci qui.


0

per Ubuntu 18.04 questo ha funzionato per me-

cifrare:

pass='123'

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

decifrare:

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