--passphraseでもgpgがパスワードを要求する


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.gpgtype gpggpg --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-packetsが最初に実行され、気づきませんでした)。そこで、ファイルが暗号化されているかどうかを判断する新しい方法を作成しました。
-Shule

回答:


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-使用

2
さて、gpgのUbuntuバージョンでは、動作してecho "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgいるようです。
CON-F-使用

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されたデータはnewに抽出され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はこのセッションでは使用できません」という警告が表示されないため、おそらくエージェントにパスフレーズが保存されていますか?
Asfand Qazi

@AsfandYarQaziいいえ、パスフレーズはコマンドラインに入力されます。
F.ハウリ

この答えは私のために働いた。Ubuntu with gpg 1.4.16。この--passphraseパラメーターはバッチ操作で機能し、パスワードの入力を求めません。
トレバーサリバン

迷惑なgpgエージェントがパスフレーズをキャッシュしているため、これは機能しているように見えます。システムを完全に再起動して新規起動するか、間違った--passphrase 5678(間違ったパスフレーズ)を入力してください。
ヤヘルマン

@yahermann:あとで試しただけunset GPG_AGENT_INFOGPG_AGENT_INFO=/dev/null、これは(継続して)動作します...設定解除$GPG_AGENT_INFOが役立つかもしれません!?(お知らせください。答えてください。このヘルプがあれば編集します!)
F.ハウリ

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のgpg 2.1.18でテスト済み。重要な--passphraseオプションを無視するこの動作は、まだバグではない場合、本当にバグになります)


1
これは、Ubuntu 18.04 Bionic with gpg(GnuPG)2.2.4
逆アセンブラー

これは、homebrewでgpgをインストールした後、MacOSで動作します
Joel

15

gpg2を使用しているようです。--batchオプションもスローする必要があります。(これをスクリプトに追加することを計画している場合は、追加することもできます。--no-ttyおそらく--yes。)


3
1.4です。--batchを使用しても効果はありません。
オミド

すみません、@ Nima。何を言ったらいいのかわかりません。GnuPG v1.4では、これらのオプションのいずれかでパスフレーズを渡すために他に何もする必要はありません。
rsaw

@rsawという良い注意書きは、パスワードプロンプトを防ぐのに役立ちました(そして、少しエレガントなecho / STDINオプション)。
ライアン

--batchはWindowsでも役立ちました。うわー

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ページによると、

--passphrase-fd n

ファイル記述子nからパスフレーズを読み取ります。ファイル記述子nから最初の行のみが読み取られます。nに0を使用すると、パスフレーズがSTDINから読み取られます。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。

--passphrase-fileファイル

ファイルfileからパスフレーズを読み取ります。ファイルfileから最初の行のみが読み取られます。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。明らかに、ファイルに保存されたパスフレーズは、他のユーザーがこのファイルを読み取ることができる場合、セキュリティが疑わしいものです。回避できる場合は、このオプションを使用しないでください。

-パスフレーズ文字列

パスフレーズとして文字列を使用します。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。明らかに、これはマルチユーザーシステム上で非常に疑わしいセキュリティです。回避できる場合は、このオプションを使用しないでください。

--pinentry-mode loopback働くために追加する

バージョン2.0以降、このパスフレーズは--batchオプションも指定されている場合にのみ使用されることに注意してください。バージョン2.1以降、-pinentry-modeもループバックに設定する必要があります。

例えば:

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

--passphrase ...オプションを機能させるには--batch--pinentry-mode loopbackオプションとオプションの両方が必要ですか?v.2.1.18の情報ページには、必要なバッチとpinentryについて同じ情報が記載されていますが(manページではありません)、まだ--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


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

このスクリプトはオプションを適切に使用し、Travis-CI--passphrase -fdを介して公開テストされており、動作中のログを見つけることができます。

ここでは、サンプルコードを提供せずに回答へのリンクを投稿するつもりはないので、更新可能な「スタンドアロン」スクリプトを以下に示します。

#!/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 pinentryモードを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.

したがって、このユーザーエージェントモードを「--pinentry-mode loopback」に変更すると、gpgのデフォルトの動作はパスフレーズの入力をユーザーに求めることです。完全なコマンド

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

0

Linuxマシンで作業している簡単な方法の1つは、1)gpgへのキーのインポート:=> shell> gpg —import 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はユーザーID、$ 3はパスワードです。

注:なぜ機能するのか思い出せませんが、機能します。詳細がわかっている場合は、ここで編集して挿入してください。


0

Ubuntu 18.04の場合、これは私のために働いた-

暗号化:

pass='123'

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

復号化:

gpg some-file.tgz.gpg
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.