gpg запрашивает пароль даже с --passphrase


65

Я ожидаю, что следующая команда извлечет файл gpg без запроса пароля:

  gpg --passphrase 1234 file.gpg

Но он просит пароль. Почему?

Это также имеет такое же поведение:

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

Я использую Ubuntu с GNOME 3 и помню, что он работал в Fedora


1
Вы уверены, что gpgзапускаете правильную команду, а не псевдоним или оболочку? Попробуйте /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionиset | grep '^.\{0,9\}PG'
F. Hauri

Для справки: если вы используете старую версию GPG, она должна работать (в Ubuntu и т. Д. Это пакет gnupg1. Однако они не рекомендуют использовать его, если вам не нужно.
Shule

Также обратите внимание, что в GPG 2.x gpg --list-packets --batch myFile.gpgзапрашивается пароль, а в GPG 1.x - нет. Это была моя проблема (в программе, которую я пишу), в то время как я думал, что у меня есть ваша проблема (вещь --list-packages была выполнена сначала, прежде чем пытаться расшифровать, и я не заметил). Итак, я сделал новый способ определить, были ли файлы зашифрованы.
Шуле

Ответы:


58

Я в той же лодке (она работала на Fedora, но не на Ubuntu). Вот очевидная работа вокруг, которую я обнаружил:

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

Объяснение: Передача 0причин --passphrase-fdдля чтения из STDIN, а не из файла. Таким образом, передача парольной фразы позволит --passphrase-fdпринять указанную вами строку пароля.


16
добавление --batch --yesк вышесказанному сработало для меня.
Райан Так

1
Но тогда у меня возникает проблема, если я хочу зашифровать данные, которые передаются в gpg, например echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Как мне это решить?
con-f-use

2
Ну, с Ubuntu версии gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgпохоже, работает.
con-f-use

1
Я получаю Inappropriate ioctl for deviceс и без --batchздесь (на gpg (GnuPG) 2.1.18).
Нико Шлёмер

2
@RyanGriggs Я так не думаю. echo "hello" | catи echo "hello"| catоба дают одну и ту же строку.
Торстен Бронджер

36

Модернизированный 2017-12-04. (Добавление --batch для предотвращения запроса пароля)

Возможно, вам придется добавить --batchопцию:

Начиная с версии 2 GPG, опция --batchнеобходима, чтобы гарантировать отсутствие запроса ... Хорошо, глядя, что:

$ 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

Попытка:

$ 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

звучит неплохо! Ну теперь:

$ 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

Хотя -dпараметр не указан (тот же синтаксис, что и в вопросе SO), расшифрованные данные file.gpgбудут извлечены в новый 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

Это хорошо работает!

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

Вы не получаете предупреждение «gpg: gpg-agent недоступен в этом сеансе», поэтому, возможно, вы сохранили в агенте пароль, возможно?
Асфанд Кази

@AsfandYarQazi Нет, пароль вводится в командной строке.
Ф. Хаури

Этот ответ работал для меня. Ubuntu с gpg 1.4.16. --passphraseПараметр работает для пакетных операций, а не запрашивать пароль.
Тревор Салливан

Может показаться, что это работает, потому что надоедливый gpg-agent кеширует ключевую фразу. Попробуйте полностью перезагрузить систему и начать заново, или введите неверный пароль - 5678 (неверный пароль).
Яхерманн

@yahermann: Только что попробовал сейчас unset GPG_AGENT_INFOи даже GPG_AGENT_INFO=/dev/null, это (продолжать) работать ... Может быть, отключение $GPG_AGENT_INFOможет помочь !? (Дайте нам знать; пожалуйста, ответьте, я отредактирую, если это поможет!)
Ф. Хаури

22

Для gpg версии 2.x вам не нужно использовать --batch, просто

--pinentry-mode loopback  

работает с --passphrase& --passphrase-file, и позволит вам ввести новую информацию, в случае конфликта имен файлов, например:

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

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

в отличие от --batchэтого быстро потерпит неудачу, говоря...failed: File exists

(протестировано на Debian Stable / Stretch's gpg 2.1.18. Такое поведение игнорирования важных --passphraseопций действительно должно быть ошибкой, если это еще не сделано)


1
Это хорошо работает и на Ubuntu 18.04 Bionic с gpg (GnuPG) 2.2.4
дизассемблер

Это работает на MacOS после установки gpg с homebrew
Джоэл

15

Похоже, вы используете gpg2. Вы должны добавить --batchопцию. (Если вы планируете добавить это в скрипт, вы также захотите добавить его --no-ttyи, возможно,. --yes)


3
Это 1.4. использование --batch не имеет никакого эффекта.
Омид

Извини тогда @Nima. Я не знаю, что тебе сказать. С GnuPG v1.4 вам не нужно ничего делать, чтобы передать парольную фразу с любым из этих параметров.
Rrsaw

Хорошая заметка, @rsaw, помогла мне предотвратить ввод паролей (и немного менее элегантный вариант echo / STDIN).
ryanm

- пакет помог даже в окнах. уу ууу.
Грех

9

для меня добавление «--no-use-agent» решило эту проблему для «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

При использовании gpg (GnuPG) 2.2.7 Согласно справочной странице,

--passphrase-fd n

Прочитайте фразу-пароль из файлового дескриптора n. Только первая строка будет считана из файлового дескриптора n. Если вы используете 0 для n, фраза-пароль будет считана из STDIN. Это можно использовать только в том случае, если указана только одна фраза-пароль.

--passphrase-file file

Прочитайте фразу-пароль из файла. Из файла будет прочитана только первая строка. Это можно использовать только в том случае, если указана только одна фраза-пароль. Очевидно, что фраза-пароль, хранящаяся в файле, имеет сомнительную безопасность, если другие пользователи могут читать этот файл. Не используйте эту опцию, если вы можете избежать этого.

--passphrase string

Используйте строку в качестве пароля. Это можно использовать только в том случае, если указана только одна фраза-пароль. Очевидно, это очень сомнительная безопасность в многопользовательской системе. Не используйте эту опцию, если вы можете избежать этого.

добавить --pinentry-mode loopback, чтобы работать

Обратите внимание, что начиная с версии 2.0 эта фраза-пароль используется только в том случае, если также была указана опция --batch. Начиная с версии 2.1, --pinentry-mode также должен быть установлен в loopback.

Например:

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

Нужны ли оба параметра --batchи --pinentry-mode loopbackпараметры для любого параметра --passphrase ...? На v.2.1.18 информационная страница говорит то же самое (но не справочную страницу) о необходимости batch & pinentry, но все еще работает только с --pinentry ... Если для v.2.2.7 действительно необходимы оба, тогда становятся смешными, разработчики специально вводят серьезные ошибки
Xen2050

4

Это сработало как волшебство для меня:

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

Ошибка: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Есть идеи?
Габриэль Стейплс

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

Вы пытались сделать:

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

Источник: Здесь


1

Я думаю, что довольно безопасный способ передачи пароля в командную строку заключается в следующем:

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

Для этого нужно создать команду «echo» и передать дескриптор файла в качестве пути к gpg (например, / dev / fd / 63). Затем gpg прочитает ключ оттуда. В то же время, команда echo должна выполняться параллельно и завершаться мгновенно, оставляя ключ в буфере fd.

Преимущества:

  • Команда gpg не будет иметь пароль в командной строке
  • Эхо будет недолгим. На самом деле, это должно быть почти мгновенно
  • Пароль никогда не будет находиться на диске, файл не будет удален, а если команда прервана, остатков не будет.

1

Вы не поверите мне, когда я скажу вам, что в ubuntu gpg пытается спросить ваш пароль, если установлен $ DISPLAY, и берет его из командной строки --password, если вы его сбросили. Это работает как ожидалось:

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

Думаю, просто еще один пример чрезмерного проектирования.


1

Вот ссылка на ответ stackoverflow, который может быть дополнительной помощи; У меня есть проект, который выполняет массовое дешифрование / шифрование, и благодаря тому, что GnuPG очень строго относится к парольным фразам, я научился трудному способу, который --passphraseработает только в редких случаях. Вместо этого рассмотрите --passphrase-fdвариант, чтобы быть более надежным.

Этот скрипт делает правильное использование --passphrase -fdопции, и был протестирован публично через Travis-CI , где вы можете найти журналы в действии.

Теперь я не собираюсь просто публиковать ссылки на ответ, не предоставив здесь пример кода, поэтому вот обновленный «автономный» скрипт, с которым вы можете поиграть:

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

Хотя вышесказанное не так сложно, как связанная защита в GitHub, оно должно быть еще более функциональным, чем ответ, приведенный в начале этого поста.

Счастливого взлома.


1

Как уже упоминалось в man gpg, можно использовать следующую опцию

--pinentry-mode mode Установите режим пинентри в режим. Допустимые значения для режима:

          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.

Поэтому поведение gpg по умолчанию - запрашивать пароль у пользователя, если изменить режим этого агента пользователя на «--pinentry-mode loopback». Он прекрасно работает. завершить команду

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

0

Один простой метод, который я нашел, работая на машине с Linux, это: 1) импортировать ключ в gpg: => shell> gpg - импортировать private_key.key

2) расшифровать, указав имя выходного файла: => shell> gpg —output -d

2.1) Приведенная выше команда предложит вам ввести перефразировку. Введите парафраз, и он расшифрует файл gpg.


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

1
было бы неплохо, если бы вы могли объяснить, почему это должно решить проблему
Zanna

1
Хотя этот фрагмент кода может решить вопрос, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос для читателей в будущем, а не только для того, кто спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение и указать, какие ограничения и предположения применяются.
Тоби Спейт

0

Поместите в конце ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Поместите в конец (возможно, новый) файл ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

И затем выполните эту команду:

echo RELOADAGENT | gpg-connect-agent

Теперь вы можете запустить это без запроса пароля:

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"

Где $ 1 - текст для шифрования, $ 2 - идентификатор пользователя, а $ 3 - пароль.

Примечание: я не могу вспомнить, почему это работает, но это работает. Если вы знаете детали, пожалуйста, отредактируйте и вставьте сюда.


0

для Ubuntu 18.04 это работало для меня

зашифровать:

pass='123'

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

расшифровывать:

gpg some-file.tgz.gpg
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.