web-dev-qa-db-fra.com

gpg demande un mot de passe même avec --passphrase

Je m'attends à ce que la commande suivante extrait le fichier gpg sans demander de mot de passe:

  gpg --passphrase 1234 file.gpg

Mais il demande le mot de passe. Pourquoi?

Cela a également le même comportement:

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

J'utilise Ubuntu avec gnome 3, et rappelez-vous qu'il fonctionnait dans Fedora

74
Omid

Je suis exactement dans votre même bateau (cela a fonctionné sur Fedora mais pas sur Ubuntu). Voici un travail apparent que j'ai découvert:

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

Explication: réussite 0 provoque --passphrase-fd pour lire à partir de STDIN plutôt qu'à partir d'un fichier. Ainsi, le traitement de la phrase de passe obtiendra --passphrase-fd pour accepter la chaîne de mot de passe spécifiée.

64
jonS90

Mis à jour le 2017-12-04. (Ajout de --batch afin d'empêcher l'invite de phrase secrète)

Vous devrez peut-être ajouter --batch option:

Depuis la version 2 de GPG, l'option --batch est nécessaire pour garantir l'absence d'invite ... Ok, en regardant cela:

$ 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

En essayant:

$ 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

ça sonne bien! Bien maintenant:

$ 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

Bien que non -d le paramètre est donné (même syntaxe que la question de SO), les données déchiffrées de file.gpg sera extrait dans un nouveau 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

Cela fonctionne bien!

$ cd -
$ rm -fR $newdir
$ unset newdir
42
F. Hauri

Pour la version 2.x de gpg, vous n'avez pas besoin d'utiliser --batch, juste

--pinentry-mode loopback  

marche avec --passphrase & --passphrase-file, et vous permettra de saisir de nouvelles informations, en cas de conflit de nom de fichier par exemple:

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

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

contrairement à --batch qui échouera rapidement, en disant ...failed: File exists

(testé sur Debian Stable/Stretch's gpg 2.1.18. Ce comportement d'ignorer les --passphrase les options devraient vraiment être un bug, si ce n'est déjà fait)

31
Xen2050

Il semble que vous utilisiez gpg2. Vous devez également ajouter l'option --batch. (Si vous prévoyez d'ajouter ceci à un script, vous voudrez également ajouter --no-tty Et probablement --yes.)

15
rsaw

Si vous utilisez gpg (GnuPG) 2.2.7 Selon la page de manuel,

--passphrase-fd n

Lisez la phrase secrète du descripteur de fichier n. Seule la première ligne sera lue à partir du descripteur de fichier n. Si vous utilisez 0 pour n, la phrase secrète sera lue depuis STDIN. Cela ne peut être utilisé que si une seule phrase de passe est fournie.

--passphrase-file file

Lisez la phrase secrète du fichier. Seule la première ligne sera lue à partir du fichier fichier. Cela ne peut être utilisé que si une seule phrase de passe est fournie. Évidemment, une phrase secrète stockée dans un fichier est d'une sécurité douteuse si d'autres utilisateurs peuvent lire ce fichier. N'utilisez pas cette option si vous pouvez l'éviter.

--passphrase string

Utilisez la chaîne comme mot de passe. Cela ne peut être utilisé que si une seule phrase de passe est fournie. Évidemment, c'est d'une sécurité très discutable sur un système multi-utilisateur. N'utilisez pas cette option si vous pouvez l'éviter.

ajouter --pinentry-mode loopback pour que cela fonctionne

Notez que depuis la version 2.0, cette phrase secrète n'est utilisée que si l'option --batch a également été donnée. Depuis la version 2.1, le mode --pinentry doit également être défini sur loopback.

Par exemple:

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

pour moi, l'ajout de "--no-use-agent" a résolu ce problème pour "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
Benedikt Fraunhofer

Cela a fonctionné comme par magie pour moi:

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-

as-tu essayé de faire:

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

Source: ici

2
abhixec

Comme mentionné dans man gpg, l'option suivante peut être utilisée

- mode mode pinentry Réglez le mode pinentry sur mode. Les valeurs autorisées pour le mode sont:

          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.

Par conséquent, le comportement par défaut de gpg est d'inviter l'utilisateur à saisir la phrase secrète, si vous changez ce mode d'agent utilisateur en "--pinentry-mode loopback", cela fonctionne parfaitement. commande complète

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

Je pense qu'une méthode assez sécurisée pour passer le mot de passe à la ligne de commande est la suivante:

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

Cela va générer la commande "echo" et passer un descripteur de fichier comme nom de chemin à gpg (par exemple/dev/fd/63). gpg lira alors la clé à partir de là. En attendant, la commande echo doit s'exécuter en parallèle et doit se terminer instantanément, en laissant la clé sur le tampon du fd.

Les avantages sont:

  • La commande gpg n'aura pas le mot de passe sur sa ligne de commande
  • L'écho sera de courte durée. En fait, ça devrait être presque instantané
  • Le mot de passe ne résidera jamais sur le disque, il n'y aura pas de fichier à supprimer et si la commande est interrompue il n'y aura pas de restes
1
V13

Vous ne me croirez pas quand je vous dirai que sur ubuntu gpg essaie de demander votre mot de passe si $ DISPLAY est défini et le prend depuis la ligne de commande --password si vous le désactivez. Cela fonctionne comme prévu:

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

Juste un autre exemple d'ingénierie excessive, je suppose.

1
badburger

Voici une réponse link à une stackoverflow qui peut être utile; J'ai un projet qui fait du déchiffrement/chiffrement en masse, et en raison de GnuPG étant très strict sur les phrases de passe, j'ai appris à la dure que --passphrase ne fonctionne que dans de rares occasions. Considérez plutôt le --passphrase-fd option pour être plus fiable.

Cette script permet une utilisation correcte du --passphrase -fd option, et a été testé publiquement via Travis-CI où vous pouvez en trouver les journaux en action.

Maintenant, je ne vais pas simplement poster des liens vers une réponse sans fournir d'exemple de code ici, alors voici un script "autonome" mis à jour avec lequel vous pouvez jouer:

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

Bien que ce qui précède ne soit pas aussi sophistiqué que la protection liée à GitHub, il devrait être encore plus fonctionnel que la réponse liée au début de ce post.

Piratage heureux.

1
S0AndS0

Mettez à la fin de ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Mettre à la fin du fichier (peut-être nouveau) ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

Et puis exécutez cette commande:

echo RELOADAGENT | gpg-connect-agent

Vous pouvez maintenant exécuter ceci sans demander de mot de passe:

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"

Où $ 1 est le texte à chiffrer, $ 2 est l'ID utilisateur et $ 3 le mot de passe.

Remarque: je ne me souviens pas pourquoi cela fonctionne, mais cela fonctionne. Si vous connaissez les détails, veuillez modifier et insérer ici.

0
Felipe

Une méthode simple que j'ai trouvée sur une machine Linux est: 1) importer la clé dans gpg: => Shell> gpg —import private_key.key

2) décrypter en donnant le nom du fichier de sortie: => Shell> gpg —output -d

2.1) Donner la commande ci-dessus vous invitera à saisir la paraphrase. Entrez la paraphrase et il déchiffrera le fichier gpg.

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

pour Ubuntu 18.04, cela a fonctionné pour moi-

crypter:

pass='123'

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

décrypter:

gpg some-file.tgz.gpg
0
kabanus