gpg prosi o hasło nawet z --passphrase


65

Oczekuję, że następujące polecenie wypakuje plik gpg bez pytania o hasło:

  gpg --passphrase 1234 file.gpg

Ale prosi o hasło. Dlaczego?

Ma to również takie samo zachowanie:

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

Używam Ubuntu z gnome 3 i pamiętam, że działało to w Fedorze


1
Czy na pewno gpguruchom odpowiednie polecenie, a nie alias ani opakowanie? Spróbuj /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versioniset | grep '^.\{0,9\}PG'
F. HAURI

Dla przypomnienia, jeśli używasz starej wersji GPG, powinna ona działać (na Ubuntu i tym podobnych, jest to pakiet gnupg1. Jednak zniechęcają do korzystania z niego, chyba że musisz
Shule

Zauważ też, że w GPG 2.x gpg --list-packets --batch myFile.gpgmonituje o podanie hasła, podczas gdy w GPG 1.x nie. To był mój problem (w programie, który piszę), podczas gdy myślałem, że mam twój problem (rzecz - pakiety -list zostały wykonane najpierw, zanim spróbowałem odszyfrować, i nie zauważyłem). Dlatego stworzyłem nowy sposób, aby ustalić, czy pliki zostały zaszyfrowane.
Shule

Odpowiedzi:


58

Jestem dokładnie w tej samej łodzi (działało na Fedorze, ale nie na Ubuntu). Oto widoczna praca, którą odkryłem:

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

Objaśnienie: Przekazywanie 0powoduje --passphrase-fdodczyt z STDIN, a nie z pliku. Zatem potokowanie hasła spowoduje --passphrase-fdzaakceptowanie określonego ciągu hasła.


16
dodanie --batch --yesdo powyższego działało dla mnie.
Ryan Tuck

1
Ale wtedy mam problem, jeśli chcę zaszyfrować dane przesyłane do gpg, np echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Jak to rozwiązać?
con-f-use

2
Cóż, z wersją gpg Ubuntu echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgwydaje się działać.
con-f-use

1
Dostaję Inappropriate ioctl for devicesię --batchtutaj i bez (na gpg (GnuPG) 2.1.18).
Nico Schlömer,

2
@RyanGriggs Nie sądzę. echo "hello" | cati echo "hello"| catoba dają ten sam ciąg.
Torsten Bronger

36

Ulepszony 2017-12-04. (Dodanie --batch, aby zapobiec wyświetlaniu monitu o hasło)

Może być konieczne dodanie --batchopcji:

Od wersji 2 GPGtej opcji --batchjest wymagana, aby nie wyświetlać monitu ... Ok, patrząc, że:

$ 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

Próbować:

$ 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

brzmi dobrze! Więc teraz:

$ 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

Chociaż nie -dpodano żadnego parametru (ta sama składnia jak pytanie SO), odszyfrowane dane file.gpgzostaną wyodrębnione do nowego 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

To działa dobrze!

$ cd -
$ rm -fR $newdir
$ unset newdir

Nie pojawia się ostrzeżenie „gpg: gpg-agent nie jest dostępny w tej sesji”, więc prawdopodobnie masz zapewnione hasło w agencie?
Asfand Qazi,

@AsfandYarQazi Nie, hasło jest wprowadzane w wierszu poleceń.
F. Hauri

Ta odpowiedź zadziałała dla mnie. Ubuntu z gpg 1.4.16. Ten --passphraseparametr działa w przypadku operacji wsadowych i nie monituje o hasło.
Trevor Sullivan

Może się to wydawać działać, ponieważ denerwujący agent gpg buforuje hasło. Spróbuj całkowicie zrestartować system i zacząć od nowa, lub wpisując niewłaściwe hasło -passphrase 5678 (złe hasło).
yahermann

@yahermann: Właśnie próbowałem teraz, unset GPG_AGENT_INFOa nawet GPG_AGENT_INFO=/dev/null, to (kontynuowanie) działa ... Może niepokojące $GPG_AGENT_INFOmoże pomóc !? (Daj nam znać; proszę odpowiedzieć,
edytuję,

22

W przypadku wersji gpg 2.x nie musisz jej używać --batch, po prostu

--pinentry-mode loopback  

współpracuje z --passphrase& --passphrase-filei pozwoli Ci wprowadzić nowe informacje, na przykład w przypadku konfliktu nazw plików:

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

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

inaczej --batchto szybko zawiedzie, mówiąc...failed: File exists

(testowane na gpg 2.1.18 Debiana Stable / Stretch. Takie zachowanie polegające na ignorowaniu ważnych --passphraseopcji naprawdę powinno być błędem, jeśli jeszcze nie jest)


1
Działa to również ładnie na Ubuntu 18.04 Bionic z gpg (GnuPG) 2.2.4
Deasembler

Działa to na MacOS po zainstalowaniu gpg z homebrew
Joel

15

Wygląda na to, że używasz gpg2. Musisz także wrzucić --batchopcję. (Jeśli planujesz dodać to do skryptu, będziesz również chciał dodać --no-ttyi prawdopodobnie --yes.)


3
To 1.4. użycie --batch nie ma wpływu.
Omid

Przepraszam więc @Nima. Nie wiem co ci powiedzieć. Z GnuPG v1.4 nie powinieneś robić nic innego, aby przekazać hasło za pomocą którejkolwiek z tych opcji.
rsaw

Dobra notatka, @rsaw, pomogła mi uniknąć monitów o hasło (i nieco mniej eleganckiej opcji echo / STDIN).
ryanm

- partia pomogła nawet w systemie Windows. woo hoo.
Sin

9

dla mnie dodanie „--no-use-agent” rozwiązało to dla „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

Jeśli używasz gpg (GnuPG) 2.2.7 Według strony podręcznika,

--passphrase-fd n

Przeczytaj hasło z deskryptora pliku n. Tylko pierwszy wiersz zostanie odczytany z deskryptora pliku n. Jeśli użyjesz 0 dla n, hasło zostanie odczytane ze STDIN. Można tego użyć tylko, jeśli podano tylko jedno hasło.

- plik -passphrase-file

Przeczytaj hasło z pliku file. Tylko pierwszy wiersz zostanie odczytany z pliku file. Można tego użyć tylko, jeśli podano tylko jedno hasło. Oczywiście hasło przechowywane w pliku stanowi wątpliwe bezpieczeństwo, jeśli inni użytkownicy mogą odczytać ten plik. Nie używaj tej opcji, jeśli możesz jej uniknąć.

- ciąg hasła

Użyj ciągu jako hasła. Można tego użyć tylko, jeśli podano tylko jedno hasło. Jest to oczywiście bardzo wątpliwe bezpieczeństwo w systemie z wieloma użytkownikami. Nie używaj tej opcji, jeśli możesz jej uniknąć.

dodaj --pinentry-mode loopback, aby pracować

Zauważ, że od wersji 2.0 to hasło jest używane tylko wtedy, gdy podano opcję --batch. Od wersji 2.1 tryb --pinentry również musi być ustawiony na loopback.

Na przykład:

gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in

Czy obie opcje --batchi --pinentry-mode loopbackopcje są potrzebne do działania dowolnej opcji --passphrase ...? W wersji 2.1.18 strona informacyjna mówi to samo (ale nie strona podręcznika) o potrzebnej partii i pinentry, ale nadal działa tylko z - pinentry ... Jeśli obie wersje są naprawdę potrzebne w wersji 2.2.7, to rzeczy
robią

4

Dla mnie działało to jak magia:

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

Błąd: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Jakieś pomysły?
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

próbowałeś zrobić:

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

Źródło: tutaj


1

Myślę, że dość bezpieczną metodą przekazania hasła do wiersza poleceń jest:

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

Spowoduje to odrodzenie polecenia „echo” i przekazanie deskryptora pliku jako nazwy ścieżki do gpg (np. / Dev / fd / 63). gpg odczyta stamtąd klucz. W międzyczasie polecenie echa powinno działać równolegle i kończyć natychmiast, pozostawiając klawisz na buforze fd.

Korzyści to:

  • Polecenie gpg nie będzie zawierało hasła w wierszu polecenia
  • Echo będzie krótkotrwałe. W rzeczywistości powinno to być prawie natychmiastowe
  • Hasło nigdy nie będzie znajdować się na dysku, nie będzie pliku do usunięcia, a jeśli polecenie zostanie przerwane, nie pozostaną żadne resztki

1

Nie uwierzysz mi, kiedy powiem ci, że na Ubuntu gpg próbuje zapytać o twoje hasło, czy $ DISPLAY jest ustawione i bierze je z wiersza poleceń - hasło, jeśli je rozbroisz. Działa to zgodnie z oczekiwaniami:

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

To chyba kolejny przykład nadmiernej inżynierii.


1

Oto link do odpowiedzi na przepełnienie stosu, która może być dalszą pomocą; Mam projekt, który dokonuje masowego deszyfrowania / szyfrowania, a ponieważ GnuPG jest bardzo rygorystyczny w odniesieniu do haseł, nauczyłem się trudnej drogi, która --passphrasedziała tylko w rzadkich przypadkach. Zamiast tego rozważ --passphrase-fdopcję bardziej niezawodną.

Ten scenariusz sprawia prawidłowe korzystanie z --passphrase -fdopcji, które były testowane publicznie przez Travis-ci , gdzie można znaleźć dzienniki go w akcji.

Teraz nie zamierzam po prostu zamieszczać linków do odpowiedzi, nie podając tutaj przykładowego kodu, więc oto zaktualizowany „samodzielny” skrypt, w który można grać:

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

Chociaż powyższe nie jest tak wymyślne, jak ochrona połączona w GitHub, powinna być jeszcze bardziej funkcjonalna niż odpowiedź podana na początku tego postu.

Miłego hakowania.


1

Jak wspomniano w man gpg, można użyć następującej opcji

- tryb pinentry Ustaw tryb pinentry na tryb. Dozwolone wartości dla trybu to:

          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.

Więc domyślnym zachowaniem gpg jest monitowanie użytkownika o podanie hasła, jeśli zmienisz ten tryb agenta użytkownika na „- loopback-mode-loopback”. Działa to doskonale. kompletne polecenie

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

0

Jedną z prostych metod, które znalazłem podczas pracy na komputerze z systemem Linux, jest: 1) importuj klucz do gpg: => shell> gpg - import private_key.key

2) odszyfruj podając nazwę pliku wyjściowego: => shell> gpg —output -d

2.1) Podanie powyższego polecenia spowoduje wyświetlenie parafrazy. Wpisz parafrazę, a ona odszyfruje plik gpg.


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

1
byłoby miło, gdybyś mógł wyjaśnić, dlaczego to powinno rozwiązać problem
Zanna

1
Ten fragment kodu może rozwiązać pytanie, ale wyjaśnienie naprawdę pomaga poprawić jakość posta. Pamiętaj, że odpowiadasz na pytanie dla czytelników w przyszłości, nie tylko dla osoby zadającej teraz pytanie! Proszę edytować swoje odpowiedzi, aby dodać wyjaśnienie, i dać wskazówkę co zastosować ograniczenia i założenia.
Toby Speight

0

Umieść na końcu ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Umieść na końcu (być może nowego) pliku ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

A następnie uruchom to polecenie:

echo RELOADAGENT | gpg-connect-agent

Teraz możesz uruchomić to bez pytania o hasło:

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"

Gdzie 1 USD to tekst do zaszyfrowania, 2 USD to identyfikator użytkownika, a 3 USD hasło.

Uwaga: nie pamiętam, dlaczego to działa, ale działa. Jeśli znasz szczegóły, edytuj i wstaw tutaj.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.