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-пакети, виконана першою, перед спробою розшифрувати, і я не помітила). Отже, я створив новий спосіб визначити, чи файли зашифровані.
Шуле

Відповіді:


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
Що ж, з версією gpg Ubuntu, 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варіант:

З версії 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-агент недоступний в цьому сеансі", тому, можливо, у вас збережена парольна фраза в агенті?
Асфанд Казі

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

Ця відповідь спрацювала на мене. Ubuntu з gpg 1.4.16. --passphraseПараметр працює для пакетних операцій, а не запитувати пароль.
Тревор Салліван

Це може здатися спрацьованим, оскільки дратівливий gpg-агент кешує парольну фразу. Спробуйте перезавантажити систему повністю і почати свіжий, або ввести неправильну - парольну фразу 5678 (неправильна парольна фраза).
yahermann

@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

(перевірено на gpg 2.1.18 Debian Stable / Stretch's. Ця поведінка ігнорування важливих --passphraseваріантів дійсно повинна бути помилкою, якщо її ще немає)


1
Це добре працює також на Ubuntu 18.04 Bionic з gpg (GnuPG) 2.2.4
Dissesembler

Це працює на MacOS після встановлення gpg з домашньою мовою
Joel

15

Це здається, що ви використовуєте gpg2. Вам також потрібно вкинути --batchваріант. (Якщо ви плануєте додати це до сценарію, ви також хочете додати його --no-ttyі, ймовірно,. --yes)


3
Це 1,4. використання --batch не має ефекту.
Омід

Вибачте, тоді @Nima. Я не знаю, що тобі сказати. З GnuPG v1.4 вам не потрібно робити нічого іншого, щоб передати пароль через будь-який із цих варіантів.
rsaw

Гарна примітка, @rsaw, допомогла мені запобігти підказки пароля (і трохи менш елегантний варіант ехо / 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 Відповідно до сторінки man,

--passfrarase-fd n

Прочитайте парольну фразу з дескриптора файлу n. З дескриптора файлу n буде прочитаний лише перший рядок. Якщо ви використовуєте 0 для n, то парольну фразу буде прочитано з STDIN. Це можна використовувати лише в тому випадку, якщо надається лише одна парольна фраза.

--passphrase-файл-файл

Прочитайте парольну фразу з файлового файлу. З файлового файлу буде прочитаний лише перший рядок. Це можна використовувати лише в тому випадку, якщо надається лише одна парольна фраза. Очевидно, що пароль, який зберігається у файлі, викликає сумніви у захисті, якщо інші користувачі можуть читати цей файл. Не використовуйте цю опцію, якщо зможете її уникнути.

- рядок фрази

Використовуйте рядок як фразу. Це можна використовувати лише в тому випадку, якщо надається лише одна парольна фраза. Очевидно, що це дуже сумнівна безпека для багатокористувацької системи. Не використовуйте цю опцію, якщо зможете її уникнути.

додати --pinentry-mode loopback, щоб працювати

Зауважте, що з версії 2.0 ця парольна фраза використовується лише в тому випадку, якщо також була задана опція --batch. Оскільки Версія 2.1, --pinentry-режим також потрібно встановити на зворотний зв'язок.

Наприклад:

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

Чи потрібні --batchі --pinentry-mode loopbackпараметри, і параметри для будь-якої опції --passphrase ...? На v.2.1.18 на інформаційній сторінці сказано те саме (але не на чоловіковій сторінці) про пакетну та піктограму, але це все ще працює лише з - довідкою ... Якщо обоє справді потрібні для версії.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

Ви не повірите мені, коли я скажу вам, що gbu ubuntu намагається запитати ваш пароль, якщо $ 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, може бути використаний наступний варіант

- Режим режиму вбудованого зв'язку Встановіть режим шпильки в режим Дозволені значення для режиму:

          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 за замовчуванням полягає в тому, щоб запросити користувача на отримання парольної фрази, якщо змінити режим цього агента користувача на "- циклічне відключення режиму". Це працює чудово. повна команда

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

0

Один простий метод, який я знайшов, працюючи на машині Linux, це: 1) ключ імпорту до gpg: => shell> gpg —імпорт private_key.key

2) розшифрувати, даючи назву Outfile: => shell> gpg —output -d

2.1) Надана вище команда запропонує ввести парафрази. Введіть парафразу, і вона розшифрує файл gpg.


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

1
Було б добре, якби ви могли пояснити, чому це має вирішити проблему
Zanna

1
Хоча цей фрагмент коду може вирішити питання, зокрема пояснення дійсно допомагає покращити якість вашої публікації. Пам’ятайте, що ви відповідаєте на запитання читачів у майбутньому, а не лише про людину, яка зараз запитує! Будь ласка, відредагуйте свою відповідь, щоб додати пояснення та вказати, які обмеження та припущення застосовуються.
Toby Speight

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 - пароль.

Примітка. Я не можу пригадати, чому це працює, але це працює. Якщо ви знаєте деталі, відредагуйте та вставте тут.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.