gpg fragt auch mit --passphrase nach dem Passwort


65

Ich erwarte, dass der folgende Befehl die gpg-Datei extrahiert, ohne nach dem Passwort zu fragen:

  gpg --passphrase 1234 file.gpg

Aber es fragt nach dem Passwort. Warum?

Dies hat auch das gleiche Verhalten:

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

Ich benutze Ubuntu mit Gnome 3 und erinnere mich, dass es in Fedora funktioniert hat


1
Sind Sie sicher, gpgdass Sie den richtigen Befehl ausführen, keinen Alias ​​oder Wrapper? Versuchen Sie /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionundset | grep '^.\{0,9\}PG'
F. Hauri

Wenn Sie die alte GPG-Version verwenden, sollte sie funktionieren (unter Ubuntu und anderen ist es das gnupg1-Paket. Sie raten jedoch davon ab, sie zu verwenden, es sei denn, Sie müssen.
Shule

Beachten Sie auch, dass in GPG 2.x gpg --list-packets --batch myFile.gpgnach einer Passphrase gefragt wird, während dies in GPG 1.x nicht der Fall ist. Das war mein Problem (in einem Programm, das ich schreibe), während ich dachte, ich hätte Ihr Problem (das --list-packages-Ding wurde zuerst ausgeführt, bevor ich versuchte, es zu entschlüsseln, und ich habe es nicht bemerkt). Also habe ich eine neue Methode entwickelt, um festzustellen, ob Dateien verschlüsselt wurden.
Shule

Antworten:


58

Ich bin genau in Ihrem Boot (es funktionierte auf Fedora, aber nicht auf Ubuntu). Hier ist eine offensichtliche Arbeit, die ich entdeckt habe:

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

Erläuterung: Das Übergeben von 0Ursachen --passphrase-fdliest aus STDIN und nicht aus einer Datei. Wenn Sie die Passphrase weiterleiten, wird --passphrase-fddie angegebene Kennwortzeichenfolge akzeptiert.


16
Das Hinzufügen --batch --yesdes oben genannten hat für mich funktioniert.
Ryan Tuck

1
Aber dann bekomme ich ein Problem, wenn ich Daten verschlüsseln möchte, die in gpg geleitet werden, z echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Wie löse ich das?
con-f-use

2
Nun, mit der Ubuntu-Version von gpg echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgscheint es zu funktionieren.
con-f-use

1
Ich komme hier Inappropriate ioctl for devicemit und ohne --batch(auf gpg (GnuPG) 2.1.18).
Nico Schlömer

2
@ RyanGriggs Ich glaube nicht. echo "hello" | catund echo "hello"| catbeide ergeben die gleiche Zeichenfolge.
Torsten Bronger

36

Aktualisiert am 04.12.2017. (Hinzufügen von --batch, um die Passwortabfrage zu verhindern)

Möglicherweise müssen Sie die --batchOption hinzufügen :

Ab Version 2 von GPGwird die Option --batchbenötigt, um sicherzustellen, dass keine Eingabeaufforderung mehr angezeigt wird.

$ 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

Versuchen:

$ 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

klingt gut! Na dann:

$ 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

Obwohl kein -dParameter angegeben ist (dieselbe Syntax wie bei der Frage von SO), werden entschlüsselte Daten aus file.gpgeinem neuen extrahiert 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

Das funktioniert gut!

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

Sie erhalten nicht die Warnung "gpg: gpg-agent ist in dieser Sitzung nicht verfügbar". Vielleicht haben Sie also die Passphrase im Agenten gespeichert?
Asfand Qazi

@AsfandYarQazi Nein, die Passphrase wird in die Befehlszeile eingegeben.
F. Hauri

Diese Antwort hat bei mir funktioniert. Ubuntu mit gpg 1.4.16. Der --passphraseParameter funktioniert für Batch-Vorgänge und fordert Sie nicht zur Eingabe eines Kennworts auf.
Trevor Sullivan

Dies scheint zu funktionieren, da der lästige GPG-Agent die Passphrase zwischenspeichert. Versuchen Sie, das System vollständig neu zu starten und neu zu starten, oder geben Sie die falsche --passphrase 5678 (falsche Passphrase) ein.
Yahermann

@yahermann: Habe erst jetzt probiert unset GPG_AGENT_INFOund auch GPG_AGENT_INFO=/dev/nulldieses (weiter) zu arbeiten ... Vielleicht $GPG_AGENT_INFOhilft ein Stoppen vielleicht !? (Lass es uns wissen; bitte antworte, ich bearbeite, wenn dies hilft!)
F. Hauri

22

Für gpg Version 2.x brauchen Sie nicht zu verwenden --batch, einfach

--pinentry-mode loopback  

arbeitet mit --passphrase& --passphrase-fileund lässt Sie neue Informationen eingeben, zum Beispiel bei Dateinamenskonflikten:

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

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

im --batchgegensatz dazu wird das schnell scheitern sagen...failed: File exists

(Getestet auf Debian Stable / Stretch's gpg 2.1.18. Dieses Verhalten, wichtige --passphraseOptionen zu ignorieren , sollte wirklich ein Fehler sein, wenn es noch nicht geschehen ist. )


1
Dies funktioniert auch unter Ubuntu 18.04 Bionic mit gpg (GnuPG) 2.2.4
Disassembler

Dies funktioniert unter MacOS nach der Installation von gpg mit Homebrew
Joel

15

Es hört sich so an, als würden Sie gpg2 verwenden. Sie müssen auch die --batchOption einwerfen . (Wenn Sie dies zu einem Skript hinzufügen möchten, möchten Sie dies --no-ttywahrscheinlich auch hinzufügen --yes.)


3
Es ist 1.4. Die Verwendung von --batch hat keine Auswirkung.
Omid

Entschuldigung dann @Nima. Ich weiß nicht, was ich dir sagen soll. Mit GnuPG v1.4 sollten Sie nichts weiter tun müssen, um die Passphrase mit einer dieser Optionen weiterzugeben.
Rsaw

Gute Nachricht, @rsaw, hat mir geholfen, Passwortabfragen (und etwas weniger elegante Echo / STDIN-Option) zu verhindern.
Ryanm

- Batch half auch in Windows. woo hoo.
Sin

9

Für mich löste das Hinzufügen von "--no-use-agent" dieses Problem für "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

Wenn Sie gpg (GnuPG) 2.2.7 verwenden, lesen Sie die Manpage

--passphrase-fd n

Lesen Sie die Passphrase aus dem Dateideskriptor n. Nur die erste Zeile wird aus dem Dateideskriptor n gelesen. Wenn Sie 0 für n verwenden, wird die Passphrase von STDIN gelesen. Dies kann nur verwendet werden, wenn nur eine Passphrase angegeben wird.

--passphrase-datei datei

Lesen Sie die Passphrase aus der Datei file. Nur die erste Zeile wird aus der Datei file gelesen. Dies kann nur verwendet werden, wenn nur eine Passphrase angegeben wird. Offensichtlich ist eine in einer Datei gespeicherte Passphrase von fragwürdiger Sicherheit, wenn andere Benutzer diese Datei lesen können. Verwenden Sie diese Option nicht, wenn Sie sie vermeiden können.

--passphrase string

Verwenden Sie eine Zeichenfolge als Passphrase. Dies kann nur verwendet werden, wenn nur eine Passphrase angegeben wird. Offensichtlich ist dies auf einem System mit mehreren Benutzern von sehr fragwürdiger Sicherheit. Verwenden Sie diese Option nicht, wenn Sie sie vermeiden können.

hinzufügen, --pinentry-mode loopbackum zu arbeiten

Beachten Sie, dass diese Passphrase seit Version 2.0 nur verwendet wird, wenn die Option --batch ebenfalls angegeben wurde. Seit Version 2.1 muss der --pinentry-Modus auch auf Loopback gesetzt werden.

Zum Beispiel:

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

Sind die Optionen --batchund --pinentry-mode loopbackerforderlich, damit die Option --passphrase ... funktioniert? In Version 2.1.18 steht auf der Infoseite dasselbe (aber nicht auf der Manpage) über Batch & Pinentry, das jedoch nur mit --pinentry funktioniert ... Wenn beide wirklich für Version 2.2.7 benötigt werden, dann sind die Dinge werden lächerlich, Entwickler führen absichtlich schwerwiegende Fehler ein
Xen2050

4

Für mich hat es wie Zauberei funktioniert:

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

Fehler: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Irgendwelche Ideen?
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

hast du versucht zu tun:

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

Quelle: hier


1

Ich denke, dass eine ziemlich sichere Methode, um das Passwort an die Kommandozeile zu übergeben, ist:

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

Damit wird der Befehl "echo" erzeugt und ein Dateideskriptor als Pfadname an gpg übergeben (z. B. / dev / fd / 63). gpg liest dann den Schlüssel von dort. In der Zwischenzeit sollte der Echo-Befehl parallel ausgeführt und sofort beendet werden, wobei die Taste im Puffer des fd verbleibt.

Vorteile sind:

  • Der Befehl gpg enthält kein Kennwort in der Befehlszeile
  • Das Echo wird von kurzer Dauer sein. Tatsächlich sollte es fast augenblicklich sein
  • Das Passwort wird sich nie auf der Festplatte befinden, es wird keine zu löschende Datei geben und wenn der Befehl unterbrochen wird, werden keine Reste übrig bleiben

1

Sie werden mir nicht glauben, wenn ich Ihnen sage, dass gpg auf Ubuntu versucht, Ihr Passwort zu erfragen, wenn $ DISPLAY gesetzt ist, und es vom Kommandozeilen-Passwort nimmt, wenn Sie es aufheben. Das funktioniert wie erwartet:

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

Nur ein weiteres Beispiel für Over Engineering, denke ich.


1

Hier ist ein Link zu einer Stackoverflow- Antwort, die möglicherweise weitere Unterstützung bietet . Ich habe ein Projekt, das Massenentschlüsselung / -verschlüsselung durchführt, und da GnuPG sehr streng mit Passwörtern umgeht, habe ich die harte Weise gelernt, die --passphrasenur in seltenen Fällen funktioniert. Betrachten Sie stattdessen die --passphrase-fdOption als zuverlässiger.

Dieses Skript nutzt die Option ordnungsgemäß--passphrase -fd und wurde öffentlich über Travis-CI getestet, wo Sie Protokolle davon in Aktion finden können.

Jetzt werde ich nicht nur Links zu einer Antwort posten, ohne hier einen Beispielcode anzugeben. Hier ist also ein aktualisiertes "Stand Alone" -Skript, mit dem Sie spielen können:

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

Das Obige ist zwar nicht so ausgefallen wie der verknüpfte Schutz bei GitHub, sollte aber noch funktionaler sein als die Antwort, die zu Beginn dieses Beitrags verlinkt wurde.

Viel Spaß beim Hacken.


1

Wie in man gpg erwähnt, kann die folgende Option verwendet werden

--pinentry-mode mode Stellt den Pinentry-Modus auf mode ein. Zulässige Werte für mode sind:

          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.

Das Standardverhalten von gpg besteht darin, den Benutzer zur Eingabe einer Passphrase aufzufordern, wenn dieser Benutzeragentenmodus auf "--pinentry-mode loopback" geändert wird. Dies funktioniert einwandfrei. Befehl abschließen

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

0

Eine einfache Methode, die ich auf einem Linux-Computer gefunden habe, ist: 1) Importiere den Schlüssel nach gpg: => shell> gpg —importiere private_key.key

2) entschlüsseln Sie den Dateinamen: => shell> gpg —output -d

2.1) Wenn Sie den obigen Befehl eingeben, werden Sie aufgefordert, eine Umschreibung einzugeben. Geben Sie die Umschreibung ein und die gpg-Datei wird entschlüsselt.


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

1
Es wäre schön, wenn Sie erklären könnten, warum dies das Problem beheben sollte
Zanna

1
Mit diesem Code-Snippet kann die Frage zwar gelöst werden, aber eine Erklärung hilft wirklich dabei , die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie in Zukunft die Frage für die Leser beantworten, nicht nur für die Person, die jetzt fragt! Bitte bearbeiten Sie Ihre Antwort Erklärung hinzuzufügen, und geben einen Hinweis darauf, was Einschränkungen und Annahmen gelten.
Toby Speight

0

Am Ende setzen von ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Am Ende der (möglicherweise neuen) Datei einfügen ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

Führen Sie dann diesen Befehl aus:

echo RELOADAGENT | gpg-connect-agent

Jetzt können Sie dies ausführen, ohne nach dem Passwort zu fragen:

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"

Dabei ist $ 1 der zu verschlüsselnde Text, $ 2 die Benutzer-ID und $ 3 das Kennwort.

Hinweis: Ich kann mich nicht erinnern, warum es funktioniert, aber es funktioniert. Wenn Sie die Details kennen, bearbeiten Sie diese bitte und fügen Sie sie hier ein.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.