gpg pede senha mesmo com --passphrase

65

Espero que o seguinte comando extraia o arquivo gpg sem pedir senha:

  gpg --passphrase 1234 file.gpg

Mas ele 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 de que ele estava funcionando no Fedora

Omid
fonte
11
Você tem certeza de gpgexecutar o comando certo, não um alias nem um wrapper? Tente /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versioneset | grep '^.\{0,9\}PG'
F. Hauri
Apenas para o registro, se você usar a versão antiga do GPG, ele deve funcionar (no Ubuntu e tal, é o pacote gnupg1 No entanto, eles desencorajam a usá-lo a menos que você tem que..
Sule
Observe também que no GPG 2.x gpg --list-packets --batch myFile.gpgsolicita uma senha, enquanto não no GPG 1.x. Esse foi o meu problema (em um programa que estou escrevendo), enquanto eu pensava ter seu problema (a coisa --list-packets foi executada primeiro, antes de tentar descriptografar, e eu não percebi). Então, criei uma nova maneira de determinar se os arquivos foram criptografados.
Shule 24/08/19

Respostas:

58

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

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

Explicação: A passagem de 0causas --passphrase-fdpara leitura de STDIN em vez de um arquivo. Portanto, o envio da frase secreta --passphrase-fdaceitará a sequência de senha especificada.

jonS90
fonte
16
adicionando --batch --yesao acima funcionou para mim.
Ryan Tuck
11
Mas então eu tenho um problema, se eu quero criptografar dados que são canalizados para gpg, por exemplo echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Como eu resolvo isso?
con-f-uso
2
Bem, com a versão Ubuntu do gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgparece funcionar.
con-f-use
11
Estou ficando Inappropriate ioctl for devicecom e sem --batchaqui (no gpg (GnuPG) 2.1.18).
Nico Schlömer
2
@RyanGriggs Acho que não. echo "hello" | cate echo "hello"| catambos produzem a mesma string.
Torsten Bronger 23/02
36

Atualizado 2017-12-04. (Adicionando --batch para evitar o prompt da senha)

Pode ser necessário adicionar a --batchopção:

A partir da versão 2 do GPG, a opção --batché necessária para garantir nenhuma solicitação ... Ok, procurando:

$ 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

parece bom! 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 -dparâmetro seja fornecido (a mesma sintaxe da pergunta de SO), os dados decodificados file.gpgserã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

Isso funciona bem!

$ cd -
$ rm -fR $newdir
$ unset newdir
F. Hauri
fonte
Você não está recebendo o aviso "gpg: gpg-agent não está disponível nesta sessão", então provavelmente você tem a senha armazenada no agente, talvez?
Asfand Qazi
@AsfandYarQazi Não, a senha é inserida na linha de comando.
F. Hauri
Essa resposta funcionou para mim. Ubuntu com gpg 1.4.16. O --passphraseparâmetro funciona para operações em lote e não solicita uma senha.
Trevor Sullivan
Isso pode parecer funcionar porque o agente gpg irritante está armazenando em cache a senha. Tente reiniciar o sistema completamente e começar do zero ou inserindo a frase-senha incorreta 5678 (senha incorreta).
yahermann 5/01
@yahermann: Acabei de tentar agora depois unset GPG_AGENT_INFOe até mesmo GPG_AGENT_INFO=/dev/null, isso (continue) para funcionar ... Talvez desestabilizar $GPG_AGENT_INFOpossa ajudar !? (Informe-nos; por favor, responda, eu editarei se isso ajudar!)
F. Hauri
22

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

--pinentry-mode loopback  

funciona com --passphrase& --passphrase-filee 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

diferente --batchdisso falhará rapidamente, dizendo...failed: File exists

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

Xen2050
fonte
11
Isso funciona bem também no Ubuntu 18.04 Bionic com gpg (GnuPG) 2.2.4
Desmontador
Isso funciona no MacOS após a instalação do gpg com homebrew
Joel
15

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

rsaw
fonte
3
É 1.4. O uso de --batch não tem efeito.
Omid
Desculpe então @Nima. Eu não sei o que te dizer. Com o GnuPG v1.4, você não precisa fazer mais nada para passar a senha com nenhuma dessas opções.
precisa saber é
Boa nota, @rsaw, me ajudou a evitar solicitações de senha (e a opção eco / STDIN um pouco menos elegante).
Ryanm
--batch ajudou mesmo no windows. woo hoo.
Sin
9

para mim, adicionar "--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
Benedikt Fraunhofer
fonte
8

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

--passphrase-fd n

Leia a senha do descritor de arquivo n. Somente a primeira linha será lida no descritor de arquivo n. Se você usar 0 para n, a senha será lida em STDIN. Isso só pode ser usado se apenas uma senha for fornecida.

--passphrase-file

Leia a senha do arquivo. Somente a primeira linha será lida do arquivo. Isso só pode ser usado se apenas uma senha for fornecida. Obviamente, uma senha armazenada em um arquivo é de segurança questionável se outros usuários puderem ler esse arquivo. Não use esta opção se puder evitá-la.

--passphrase string

Use string como a senha. Isso só pode ser usado se apenas uma senha for fornecida. Obviamente, isso é de segurança muito questionável em um sistema multiusuário. Não use esta opção se puder evitá-la.

adicionar --pinentry-mode loopbackpara trabalhar

Observe que, desde a versão 2.0, essa senha é usada apenas se a opção --batch também tiver sido fornecida. Desde a versão 2.1, o modo --pinentry também precisa ser definido como loopback.

Por exemplo:

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in
Kaho Lau
fonte
As opções --batche são --pinentry-mode loopbacknecessárias para que qualquer opção --passphrase ... funcione? Na v.2.1.18, a página de informações diz o mesmo (mas não a página de manual) sobre lote e pinentry necessários, mas ainda funciona apenas com --pinentry ... Se ambos são realmente necessários para a v.2.2.7, então as coisas está ficando ridículo, os desenvolvedores estão introduzindo erros graves de propósito
Xen2050
4

Funcionou como mágica para mim:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp
grepit
fonte
erro: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Alguma ideia?
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
jas-
fonte
2

você já tentou fazer:

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

Fonte: Aqui

abhixec
fonte
1

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

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

O que isto fará é gerar o comando "echo" e passar um descritor de arquivo como um nome de caminho para o gpg (por exemplo, / dev / fd / 63). O gpg lerá a chave a partir daí. Enquanto isso, o comando echo deve executar em paralelo e 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 terá vida curta. De fato, 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
V13
fonte
1

Você não vai acreditar em mim quando eu lhe digo que no ubuntu gpg tenta perguntar sua senha se $ DISPLAY estiver definido e a usar na linha de comando --password, se você a desarmar. Isso funciona conforme o esperado:

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

Apenas mais um exemplo de excesso de engenharia, eu acho.

badburger
fonte
1

Aqui está um link para uma resposta de stackoverflow que talvez seja de mais assistência; Eu tenho um projeto que faz descriptografia / criptografia em massa e, devido ao GnuPG ser muito rigoroso com as senhas, aprendi da maneira mais difícil que --passphrasefunciona apenas em raras ocasiões. Em vez disso, considere a --passphrase-fdopção mais confiável.

Este script faz uso adequado da --passphrase -fdopção e foi testado publicamente pelo Travis-CI, onde você pode encontrar os logs em ação.

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

#!/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 exposto acima não seja tão sofisticado quanto a proteção vinculada no GitHub, ele deve ser ainda mais funcional do que a resposta vinculada no início desta postagem.

Feliz hacking.

S0AndS0
fonte
1

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

- modo de pinentry Defina o modo de pinentry para o modo. Os 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 a senha, se alterar o modo do agente do usuário para "- loopentry-mode loopback" Funciona perfeitamente. comando completo

gpg --pinentry-mode loopback --passphrase <passphrase> -d <file to decrypt>
Sumit Singh
fonte
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) decifrar o nome do arquivo externo: => shell> gpg —put -d

2.1) Dar o comando acima solicitará que você digite a paráfrase. Digite a paráfrase e ela descriptografará o arquivo gpg.

Mohit Gupta
fonte
0
gpg2 -se --passphrase yourpassword --batch --yes -r user@example.com filename
KP Singh
fonte
11
seria bom se você pudesse explicar por que isso deve resolver o problema
Zanna
11
Embora esse trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade da sua postagem. Lembre-se de que você está respondendo à pergunta dos leitores no futuro, não apenas à pessoa que está perguntando agora! Por favor edite sua resposta para adicionar explicação, e dar uma indicação do que limitações e premissas se aplicam.
precisa
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 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.

Felipe
fonte
0

para o Ubuntu 18.04, isso funcionou para mim

criptografar:

pass='123'

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

descriptografar:

gpg some-file.tgz.gpg
kabanus
fonte