gpg pede senha mesmo com --passphrase

45

Eu espero que o seguinte comando extraia o arquivo gpg sem pedir senha:

  gpg --passphrase 1234 file.gpg

Mas pede a senha. Por quê?

Isso também tem o mesmo comportamento:

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

Eu uso o Ubuntu com o gnome 3, e lembre-se que ele estava funcionando no Fedora

    
por Omid 03.01.2013 / 21:11

16 respostas

45

Estou exatamente no mesmo barco (funcionou no Fedora, mas não no Ubuntu). Aqui está um trabalho aparente que descobri:

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

Explicação: A passagem de 0 faz com que --passphrase-fd seja lido a partir de STDIN, e não de um arquivo. Portanto, canalizar a frase secreta receberá --passphrase-fd para aceitar sua sequência de senhas especificada.

    
por 21.03.2013 / 20:19
19

Atualizado em 2017-12-04. (Adicionando - lote a fim impedir o prompt de senha)

Você pode ter que adicionar a opção --batch :

A partir da versão 2 de GPG , a opção --batch é necessária para garantir que nenhum prompt ... Ok, parecendo isso:

$ 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

Tentando:

$ 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

bom som! Bem, agora:

$ 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

Embora nenhum parâmetro -d seja fornecido (mesma sintaxe da pergunta do SO), os dados descriptografados de file.gpg serão extraídos para um novo 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

Este trabalho funciona bem!

$ cd -
$ rm -fR $newdir
$ unset newdir
    
por 06.01.2013 / 15:01
14

Parece que você está usando o gpg2. Você precisa incluir também a opção --batch . (Se você planeja adicionar isso a um script, você também desejará adicionar --no-tty e provavelmente --yes .)

    
por 03.01.2013 / 23:26
8

Para o gpg versão 2.x, você não precisa usar --batch , apenas

--pinentry-mode loopback  

funciona com --passphrase & --passphrase-file e permitirá que você insira novas informações, no caso de conflitos de nome de arquivo, por exemplo:

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

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

ao contrário de --batch , que falhará rapidamente, dizendo ...failed: File exists

(testado no gpg do Debian Stable / Stretch 2.1.18. Esse comportamento de ignorar importantes opções de --passphrase realmente deve ser um bug, se já não for)

    
por 05.01.2018 / 20:40
7

para mim, adicionando "--no-use-agent" resolveu isso para "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
    
por 22.08.2016 / 14:02
4

Funcionou como mágica para mim:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp
    
por 16.12.2016 / 20:56
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
    
por 25.09.2013 / 18:54
3

Se estiver usando o gpg (GnuPG) 2.2.7 De acordo com a página man,

--passphrase-fd n

Read the passphrase from file descriptor n. Only the first line will be read from file descriptor n. If you use 0 for n, the passphrase will be read from STDIN. This can only be used if only one passphrase is supplied.

--passphrase-file file

Read the passphrase from file file. Only the first line will be read from file file. This can only be used if only one passphrase is supplied. Obviously, a passphrase stored in a file is of questionable security if other users can read this file. Don't use this option if you can avoid it.

--passphrase string

Use string as the passphrase. This can only be used if only one passphrase is supplied. Obviously, this is of very questionable security on a multi-user system. Don't use this option if you can avoid it.

adicione --pinentry-mode loopback para trabalhar

Note that since Version 2.0 this passphrase is only used if the option --batch has also been given. Since Version 2.1 the --pinentry-mode also needs to be set to loopback.

Por exemplo:

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in
    
por 07.06.2018 / 09:05
2

você já tentou:

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

Fonte: Aqui

    
por 12.01.2013 / 07:36
1

Eu acho que um método bastante seguro para passar a senha para a linha de comando é:

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

O que isso fará é gerar o comando "echo" e passar um descritor de arquivo como um nome de caminho para gpg (por exemplo, / dev / fd / 63). gpg então lerá a chave de lá. Nesse meio tempo, o comando echo deve rodar em paralelo e deve terminar instantaneamente, deixando a chave no buffer do fd.

Os benefícios são:

  • O comando gpg não terá a senha em sua linha de comando
  • O eco será de curta duração. Na verdade, deve ser quase instantâneo
  • A senha nunca residirá no disco, não haverá um arquivo a ser excluído e, se o comando for interrompido, não haverá sobras
por 06.02.2016 / 15:28
1

Você não acreditará em mim quando eu lhe disser que no ubuntu o gpg tenta perguntar sua senha se o $ DISPLAY estiver configurado e o pega da linha de comando - senha se você o remover. Isso funciona como esperado:

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

Apenas mais um exemplo de engenharia excessiva, eu acho.

    
por 21.03.2016 / 04:31
1

Aqui está um link para uma resposta stackoverflow que talvez tenha mais assistência; Eu tenho um projeto que faz decriptação / criptografia em massa, e devido ao GnuPG ser muito rigoroso sobre senhas, aprendi da maneira mais difícil que --passphrase só funciona em raras ocasiões. Em vez disso, considere a opção --passphrase-fd como mais confiável.

Este script torna adequado o uso do --passphrase -fd option, e foi testado publicamente via Travis-CI onde você pode encontrar logs dele em ação.

Agora, não vou apenas postar links para uma resposta sem fornecer algum código de exemplo aqui, então aqui está um script "autônomo" atualizado com o qual você pode brincar:

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

Embora o acima não seja tão elegante quanto o link protegido no GitHub, ele deve ser ainda mais funcional do que a resposta vinculada no começo deste post.

Hacker feliz.

    
por 06.11.2016 / 02:50
1

Como mencionado em man gpg, a opção seguinte pode ser usada

- modo de modo de pinagem               Defina o modo de pinagem para o modo. Valores permitidos para o modo são:

          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.

Portanto, o comportamento padrão do gpg é solicitar ao usuário uma passphrase, se alterar esse modo de agente do usuário para "- loopback de modo de ponteiro" Funciona perfeitamente bem. comando completo

gpg --pinentry-mode loopback --passphrase <passphrase> -d <file to decrypt>
    
por 20.11.2018 / 22:40
0

Um método simples que encontrei trabalhando em uma máquina linux é: 1) chave de importação para gpg: = >     shell > gpg —import private_key.key

2) descriptografar dando outfile nome: = >     shell > gpg - saída -d

2.1) Dando o comando acima, você será solicitado a digitar a paráfrase. Digite a paráfrase e ele irá descriptografar o arquivo gpg.

    
por 18.03.2015 / 06:40
0
gpg2 -se --passphrase yourpassword --batch --yes -r [email protected] filename
    
por 27.02.2017 / 09:30
0

Coloque no final de ~/.gnupg/gpg.conf :

use-agent
pinentry-mode loopback

Coloque no final do arquivo (talvez novo) ~/.gnupg/gpg-agent.conf :

allow-loopback-pinentry

E, em seguida, execute este comando:

echo RELOADAGENT | gpg-connect-agent

Agora você pode executar isso sem pedir uma senha:

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"

Onde $ 1 é o texto a ser criptografado, $ 2 é o ID do usuário e $ 3 a senha.

Nota: não me lembro por que funciona, mas funciona. Se você conhece os detalhes, edite e insira aqui.

    
por 26.11.2017 / 21:07