Comment utiliser l'argument passphrase-fd de Gnupg?

je voudrais utiliser GnuPGs decrypt commande sans intervention de l'utilisateur. Le script est --passphrase-fd argument semble exactement ce dont j'ai besoin. Mais je ne sais pas comment ça marche - je n'ai pas trouvé d'exemples.

quelqu'un pourrait-il me donner un exemple d'une telle commande, sur les environnements Windows et UNIX?

(pour info, j'utilise GnuPG 2).

Merci :)

25
demandé sur Blackbird 2013-11-11 00:59:36

4 réponses

afin d'utiliser l'option gpg --passphrase-fd dans GnuPG v2, vous devez spécifier le --batch paramètre. Je vais d'abord expliquer comment --passphrase-fd fonctionne, et les exemples.

--passphrase-fd indique à GnuPG qui descripteur de fichier (- fd) de s'attendre à ce que la phrase de passe Vienne de. Les descripteurs de fichier standard sont STDIN (0), STDOUT (1) et STDERR (2). Dans le contexte de cette question, vous ne seriez normalement préoccupé que par STDIN (0).

Vous n'avez pas spécifié d'où vous voulez que le mot de passe vienne, donc je vais vous montrer L'utilisation de STDIN (standard in) de différentes façons.

--passphrase-fd 0 dit à GnuPG de récupérer la phrase de passe à partir de l'entrée dans le shell courant; par exemple, si vous voulez que GnuPG récupère les données de phrase de passe dans la toute prochaine ligne d'entrée de la console, la commande et la sortie seront comme suit:

gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
<next line of input is passphrase followed by hitting enter>
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

dans l'exemple ci-dessus, la phrase de passe a été fournie via le descripteur de fichier 0 (STDIN) - que nous avons fourni par entrée sur l'entrée standard de shells current.

dans l'exemple suivant, nous allons dire à GnuPG de récupérer la phrase de passe à partir de l'entrée dans le shell courant qui est en fait la sortie d'une autre commande (echo, dans ce cas, qui fait simplement "écho" à ce que vous lui dites):

echo "mypassphrase" | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

un Autre exemple qui vide le contenu d'un fichier qui contient le mot de passe pour STDIN -

cat /path/to/file_with_passphrase | gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp
gpg: encrypted with 1024-bit RSA key, ID EC18C175, created 2013-10-26
      "testkey4321 (4321) <test@4321.com>"
this is a test... this is only a test...

En résumé, --passphrase-fd juste dit à GnuPG que vous voulez le nourrir passphrase nécessaire via un descripteur de fichier standard; la différence entre GnuPG v2 et GnuPG est simplement --batch paramètre.

les exemples ci - dessus devraient fonctionner de la même façon dans les environnements Windows et *nix, la seule différence étant que dans Windows - selon votre configuration et version-vous devrez remplacer cattype afin de transférer le contenu d'un fichier à STDIN.

33
répondu kylehuff 2014-01-22 21:34:48

la réponse de kylehuff ne fonctionnerait toujours pas pour moi, avec gpupg qui affiche toujours une invite de mot de passe.

selon https://wiki.archlinux.org/index.php/GnuPG#Unattended_passphrase avec la version 2.1.0 de gnupg et plus, vous devez faire des étapes supplémentaires pour supporter --passphrase-fd

tout d'abord, éditez la configuration gpg-agent pour permettre le mode pinentry loopback: ~ / .GnuPG / gpg-agent.conf

allow-loopback-pinentry

redémarrez le processus gpg-agent si elle est en cours d'exécution pour laisser la modification prenne effet.

dans un Deuxième temps, l'application doit être mis à jour pour inclure un paramètre de ligne de commande à utiliser mode de bouclage de la sorte:

$ gpg --pinentry-mode loopback ...
17
répondu JodiTheTigger 2016-07-08 02:44:27
passphrase-fd 0 et pour contourner l'invite, je peux confirmer que les œuvres suivantes:

--pinentry-mode loopback
3
répondu Sanjay Singh 2017-12-06 21:16:44

comme j'ai dû le découvrir moi-même récemment, j'ai pensé qu'il vaudrait peut-être la peine d'intervenir.

la réponse de kylehuff est très bonne si vous déchiffrez des fichiers, cependant, si vous avez besoin de redirection d'entrée / sortie, comme la tuyauterie, voici un exemple d'utilisation d'un non -0 descripteur de fichier pour passer la phrase de passe.

#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass_location="/path/to/passphrase.file"
Var_gpg_decrypt_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
exec ${Var_fd}<${Var_pass_location}
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_decrypt_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-

Soyez averti, en dehors des cas d'Utilisation spéciale, que la sauvegarde de votre phrase de passe de clés privées est généralement considérée comme une mauvaise idée ou une mauvaise pratique de sécurité. -Aussi s'il vous plaît ne pas oublier de fermer le descripteur une fois terminé de sorte que votre phrase de passe n'est plus accessible via cette méthode.- J'ai souvent vu conseillé dans ces cas d'utilisation d'utiliser des clés spécifiquement Non-passphrase protégées, mais c'est totalement votre choix. Si vous aimez le code ci-dessus, vous pouvez aussi vérifier le script pour lequel j'ai débogué génération de la clé soit sans surveillance, soit avec assistance parce qu'il couvre un descripteur de fichier gpg encore moins utilisé option.

Modifications/mises à jour

J'ai donc débogué les opérations de déchiffrement en bloc et j'ai des preuves pour montrer que les descripteurs de fichiers semblent se fermer automatiquement ou peut-être que C'est automatiquement fermé par GnuPG. Vérifier la construction 152 tout le chemin en bas de la grumes, juste avant diff vérifie, vous trouverez que le premier bloc de données cryptées ate la phrase, laissant les deux blocs de données sans mot de passe. La relative les scripts de cette opération sont; d'abord lescript_decrypt.sh build script définit la phrase de passage de la touche test en descripteur de fichier 9 comme indiqué dans les exemples ci-dessus, puis le script d'aide est appelé tel qu'il va faire usage de ce descripteur de fichier... c'est un cas d'utilisation funky mais la morale de l'histoire semble être que ce que jamais opérations de décryptage en vrac que vous prévoyez de mettre en œuvre avec des descripteurs de fichiers GnuPG aura probablement besoin de suivre les étapes décrites ci-dessus dans son ensemble fonction pour avoir correctement les descripteurs de fichier réouverts. Je vais réécrire le script helper au cours des prochaines pushes alors vérifiez le Travis-CI construire des logs supérieurs à 152 pour savoir si j'ai une solution où les descripteurs de fichier fermé...

... alors qu'il n'a fallu que deux essais pour que les choses fonctionnent, voir la différence dans build 154 le fichier chiffré et le journal d'entrée brut concordent. Comme supposé, les descripteurs de fichiers sont jetés après la première utilisation. par GnuPG ou un sous-shell, la phrase de passe doit donc être assignée avant chaque commande de décryptage pour que le décryptage en vrac se produise.

J'espère que ça vous a été utile.

2
répondu S0AndS0 2016-11-06 00:12:14