it-swarm.com.de

gpg fragt auch mit --passphrase nach dem Passwort

Ich erwarte, dass der folgende Befehl die GPG-Datei extrahiert, ohne nach einem 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

74
Omid

Ich bin in genau demselben Boot (es hat auf Fedora funktioniert, 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: Bestehen von 0 verursacht --passphrase-fd zum Lesen aus STDIN und nicht aus einer Datei. Wenn Sie also die Passphrase weiterleiten, erhalten Sie --passphrase-fd, um die angegebene Kennwortzeichenfolge zu akzeptieren.

64
jonS90

Aktualisiert am 04.12.2017. (Hinzufügen von --batch, um die Eingabeaufforderung für Passphrasen zu verhindern)

Möglicherweise müssen Sie --batch Möglichkeit:

Ab Version 2 von GPG ist die Option --batch wird benötigt, um sicherzustellen, dass keine Eingabeaufforderung 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

Versuch:

$ 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

Während kein -d Parameter wird angegeben (gleiche Syntax wie SOs Frage), entschlüsselte Daten von file.gpg wird in ein neues file extrahiert.

$ 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
42
F. Hauri

Für gpg Version 2.x müssen Sie nur --batch Verwenden

--pinentry-mode loopback  

funktioniert mit --passphrase & --passphrase-file und ermöglicht die Eingabe neuer Informationen, beispielsweise bei Dateinamenkonflikten:

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

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

im Gegensatz zu --batch schlägt dies schnell fehl und sagt ...failed: File exists

(getestet auf Debian Stable/Stretch's gpg 2.1.18. Dieses Verhalten beim Ignorieren wichtiger --passphrase Optionen sollte wirklich ein Fehler sein, wenn es nicht bereits geschehen ist)

31
Xen2050

Es hört sich so an, als würden Sie gpg2 verwenden. Sie müssen auch die Option --batch Aktivieren. (Wenn Sie dies einem Skript hinzufügen möchten, möchten Sie auch --no-tty Und wahrscheinlich --yes Hinzufügen.)

15
rsaw

Bei Verwendung von gpg (GnuPG) 2.2.7 Laut 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 aus STDIN gelesen. Dies kann nur verwendet werden, wenn nur eine Passphrase angegeben wird.

--passphrase-file file

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

--passphrase string

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

hinzufügen --pinentry-mode loopback um zu arbeiten

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

Zum Beispiel:

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

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
9

Es hat wie Magie für mich funktioniert:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp
4
grepit
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
4
jas-

hast du versucht:

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

Quelle: hier

2
abhixec

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

--pinentry-mode mode Setzt den pinentry-Modus auf mode. Zulässige Werte für den Modus 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 ist also, Benutzer zur Eingabe einer Passphrase aufzufordern, wenn dieser Benutzeragentenmodus in "--pinentry-mode loopback" geändert wird. Dies funktioniert einwandfrei. Befehl vervollständigen

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

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

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

Dies erzeugt den Befehl "echo" und übergibt einen Dateideskriptor als Pfadnamen an gpg (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 der Schlüssel im Puffer des fd verbleibt.

Vorteile sind:

  • Der Befehl gpg hat kein Kennwort in der Befehlszeile
  • Das Echo wird von kurzer Dauer sein. In der Tat sollte es fast sofort sein
  • Das Passwort befindet sich niemals auf der Festplatte, es wird keine Datei gelöscht, und wenn der Befehl unterbrochen wird, bleiben keine Reste übrig
1
V13

Sie werden mir nicht glauben, wenn ich Ihnen sage, dass gpg auf ubuntu versucht, Ihr Passwort zu fragen, ob $ DISPLAY gesetzt ist, und es von der Kommandozeile --password übernimmt, wenn Sie es deaktivieren. Dies funktioniert wie erwartet:

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

Nur ein weiteres Beispiel für Überentwicklung, denke ich.

1
badburger

Hier ist eine Link zu einer Stackoverflow Antwort, die möglicherweise weitere Hilfe bietet. Ich habe ein Projekt, das Massenentschlüsselung/-verschlüsselung durchführt, und da GnuPG sehr streng mit Passphrasen umgeht, habe ich auf die harte Tour gelernt, dass --passphrase funktioniert nur in seltenen Fällen. Betrachten Sie stattdessen das --passphrase-fd Option, um zuverlässiger zu sein.

Dieses Skript macht die richtige Verwendung des --passphrase -fd Option 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 veröffentlichen, ohne hier einen Beispielcode anzugeben. Hier ist also ein aktualisiertes "eigenständiges" 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=( "[email protected]" )
# 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 verlinkte Schutz bei GitHub, aber sollte noch funktionaler sein als die Antwort, die zu Beginn dieses Beitrags verlinkt wurde.

Viel Spaß beim Hacken.

1
S0AndS0

Setzen Sie am Ende von ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Fügen Sie am Ende der (möglicherweise neuen) Datei ~/.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"

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

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

0
Felipe

Eine einfache Methode, die ich bei der Arbeit auf einem Linux-Computer gefunden habe, ist: 1) Importschlüssel in gpg: => Shell> gpg - importiere private_key.key

2) entschlüsseln Sie den Namen der Outfile: => Shell> gpg —output -d

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

0
Mohit Gupta
gpg2 -se --passphrase yourpassword --batch --yes -r [email protected] filename
0
KP Singh

für Ubuntu 18.04 funktionierte dies für mich-

verschlüsseln:

pass='123'

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

entschlüsseln:

gpg some-file.tgz.gpg
0
kabanus