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


65

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 aussi le même comportement:

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

J'utilise Ubuntu avec Gnome 3 et je me souviens qu'il fonctionnait dans Fedora.


1
Êtes-vous sûr d' gpgexécuter la bonne commande, pas un alias ni un wrapper? Essayez /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionetset | grep '^.\{0,9\}PG'
F. Hauri

Pour mémoire, si vous utilisez l'ancienne version de GPG, cela devrait fonctionner (sur Ubuntu et autres, c'est le paquetage gnupg1. Cependant, ils découragent de l'utiliser sauf si vous devez le faire.
Shule

Notez également que dans GPG 2.x vous gpg --list-packets --batch myFile.gpginvite à saisir une phrase secrète, contrairement à GPG 1.x. C'était mon problème (dans un programme que j'écris), alors que je pensais avoir votre problème (la chose --list-paquets est exécutée en premier, avant de tenter de décrypter, et je n'ai pas remarqué). J'ai donc créé un nouveau moyen de déterminer si les fichiers étaient cryptés.
Shule

Réponses:


58

Je suis dans votre bateau même (ça 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

Explanation: Les 0causes --passphrase-fdpassées à lire proviennent de STDIN plutôt que d'un fichier. Ainsi, la phrase secrète --passphrase-fdacceptera la chaîne de mot de passe spécifiée.


16
ajouter --batch --yesà ce qui précède a fonctionné pour moi.
Ryan Tuck

1
Mais alors je reçois un problème, si je veux chiffrer des données qui sont canalisées dans gpg, par exemple echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Comment résoudre ce problème?
con-f-use

2
Eh bien, avec la version Ubuntu de gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgsemble fonctionner.
con-f-use

1
Je reçois Inappropriate ioctl for deviceavec et sans --batchici (sur gpg (GnuPG) 2.1.18).
Nico Schlömer

2
@RyanGriggs Je ne pense pas. echo "hello" | catet les echo "hello"| catdeux donnent la même chaîne.
Torsten Bronger le

36

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

Vous devrez peut-être ajouter une --batchoption:

A partir de la version 2 de GPG, l'option --batchest nécessaire pour éviter toute invite ... Ok, je regarde ça:

$ 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 qu'aucun -dparamètre ne soit fourni (même syntaxe que la question de SO), les données décryptées file.gpgseront extraites vers 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

Vous n'obtenez pas l'avertissement "gpg: gpg-agent n'est pas disponible dans cette session", vous avez probablement la phrase secrète stockée dans l'agent, peut-être?
Asfand Qazi

@AsfandYarQazi Non, la phrase secrète est entrée en ligne de commande.
F. Hauri

Cette réponse a fonctionné pour moi. Ubuntu avec gpg 1.4.16. Le --passphraseparamètre fonctionne pour les opérations par lots et ne demande pas de mot de passe.
Trevor Sullivan

Cela peut sembler fonctionner parce que l'agent gpg ennuyeux met en cache la phrase secrète. Essayez de redémarrer complètement le système et de recommencer à zéro, ou entrez une erreur - phrase secrète 5678 (phrase secrète incorrecte).
Yahermann

@yahermann: Je viens d'essayer maintenant après unset GPG_AGENT_INFOet même GPG_AGENT_INFO=/dev/null, cela (continuer) de fonctionner ... Peut-être que le fait de le dire $GPG_AGENT_INFOpeut aider !? (Faites-le-nous savoir, répondez-moi s'il vous plaît, je vais éditer cette aide si nécessaire!)
F. Hauri

22

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

--pinentry-mode loopback  

fonctionne avec --passphrase& --passphrase-file, et vous laissera entrer 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 à --batchcela va rapidement échouer, en disant...failed: File exists

(testé sur le gpg 2.1.18 de Debian Stable / Stretch. Ce comportement consistant à ignorer les --passphraseoptions importantes devrait être un bogue, s'il ne l'est pas déjà)


1
Cela fonctionne très bien aussi sur Ubuntu 18.04 Bionic avec gpg (GnuPG) 2.2.4
Disassembler

Cela fonctionne sur MacOS après l’installation de gpg avec homebrew
Joel

15

On dirait que vous utilisez gpg2. Vous devez également --batchchoisir cette option. (Si vous envisagez d’ajouter ceci à un script, vous voudrez également l’ajouter, --no-ttyet probablement --yes.)


3
C'est 1.4. L'utilisation de --batch n'a aucun effet.
Omid

Désolé alors @ Nima. Je ne sais pas quoi te dire. Avec GnuPG v1.4, vous n'avez plus besoin de rien faire pour passer la phrase secrète avec l'une de ces options.
republié

Bonne note, @rsaw, m'a aidé à empêcher les invites de mot de passe (et l'option echo / STDIN légèrement moins élégante).
ryanm

--batch a aidé même dans les fenêtres. woo hoo.
Sin

9

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

8

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 dans le descripteur de fichier n. Si vous utilisez 0 pour n, la phrase secrète sera lue à partir de STDIN. Cela ne peut être utilisé que si un seul mot de passe est fourni.

--passphrase-file fichier

Lire la phrase secrète du fichier fichier. Seule la première ligne sera lue à partir du fichier fichier. Cela ne peut être utilisé que si un seul mot de passe est fourni. De toute évidence, 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 phrase secrète. Cela ne peut être utilisé que si un seul mot de passe est fourni. De toute évidence, cette sécurité est très discutable sur un système multi-utilisateur. N'utilisez pas cette option si vous pouvez l'éviter.

ajouter --pinentry-mode loopbackpour travailler

Notez que depuis la version 2.0, ce mot de passe n'est utilisé 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

Les options --batchand --pinentry-mode loopbacknécessaires pour une option --passphrase ... fonctionnent-elles? Sur la v.2.1.18, la page d’information dit la même chose (mais pas la page de manuel) à propos de batch & pinentry, mais fonctionne toujours avec seulement --pinentry ... Si les deux sont vraiment nécessaires pour la v.2.2.7, deviennent ridicules, les développeurs introduisent intentionnellement des bugs sérieux
Xen2050

4

Cela a fonctionné comme par magie pour moi:

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

erreur: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Des idées?
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

as-tu essayé de faire:

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

Source: ici


1

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 faire apparaître la commande "echo" et passer un descripteur de fichier comme chemin d'accès à gpg (par exemple / dev / fd / 63). gpg lira alors la clé à partir de là. Dans le même temps, la commande echo doit être exécutée en parallèle et se terminer instantanément, en laissant la clé sur la mémoire 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, cela 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 ne restera aucun reste

1

Vous ne me croirez pas quand je vous dirai que sur ubuntu gpg essaie de vous 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 sur je suppose.


1

Voici un lien vers une réponse stackoverflow qui pourrait vous aider davantage; J'ai un projet de décryptage / cryptage en masse, et comme GnuPG est très strict en matière de mots de passe passifs, il a appris de manière difficile qu'il --passphrasene fonctionne que très rarement. Pensez plutôt que l' --passphrase-fdoption est plus fiable.

Ce script utilise correctement l' --passphrase -fdoption et a été testé publiquement via Travis-CI, où vous pouvez trouver les journaux de cette action en action.

Maintenant, je ne vais pas simplement poster des liens vers une réponse sans fournir un exemple de code ici. Voici donc 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}>&-

Même si ce qui précède n’est pas aussi sophistiqué que la protection liée sur GitHub, il devrait être encore plus fonctionnel que la réponse liée au début de ce message.

Heureux piratage.


1

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

--Mode mode pinentry Définit 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 modifiez ce mode d'agent d'utilisateur en "--pinentry-mode loopback", il fonctionne parfaitement. commande complète

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

0

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

2) déchiffrer donnant le nom du fichier de sortie: => shell> gpg —output -d

2.1) Donner la commande ci-dessus vous invitera à entrer une paraphrase. Entrez la paraphrase et il va déchiffrer le fichier gpg.


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

1
ce serait bien si vous pouviez expliquer pourquoi cela résoudrait le problème
Zanna

1
Bien que cet extrait de code puisse résoudre la question, l'inclusion d'une explication contribue réellement à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question pour les lecteurs dans le futur, pas seulement pour la personne qui le demande maintenant! Veuillez modifier votre réponse pour ajouter une explication et donner une indication des limitations et hypothèses applicables.
Toby Speight

0

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

use-agent
pinentry-mode loopback

Mettez à la fin du (éventuellement nouveau) fichier ~/.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 représente le texte à chiffrer, $ 2 l'identifiant de l'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 éditer et insérer ici.


0

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.