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
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.
Mis à jour le 2017-12-04. (Ajout de --batch afin d'empêcher l'invite de phrase secrète)
--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
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)
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
.)
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
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
Cela a fonctionné comme par magie pour moi:
echo "YOUR_PASS_PHRASE" | gpg --batch --yes --passphrase-fd 0 /home/somewhere/your_file.pgp
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
as-tu essayé de faire:
gpg --batch --passphrase-fd 0 --decrypt-files *.gpg
gpg --passphrase-fd 0 1234 file.gpg
Source: ici
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>
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:
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.
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.
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.
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.
gpg2 -se --passphrase yourpassword --batch --yes -r [email protected] filename
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