web-dev-qa-db-ja.com

--passphraseを使用してもgpgがパスワードを要求する

次のコマンドは、パスワードを要求せずにgpgファイルを抽出することを期待しています。

  gpg --passphrase 1234 file.gpg

しかし、パスワードを要求します。どうして?

これも同じ動作をします:

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

私はgnome 3でUbuntuを使用していますが、Fedoraで動作していたことを覚えています

74
Omid

私はあなたとまったく同じ船に乗っています(UbuntuではなくFedoraで動作しました)。これは私が発見した明らかな回避策です:

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

説明:0を渡すと、--passphrase-fdがファイルではなくSTDINから読み取られます。したがって、パスフレーズをパイプすると、--passphrase-fdを取得して、指定したパスワード文字列を受け入れることができます。

64
jonS90

2017-12-04をアップグレードしました。 (パスフレーズのプロンプトを防ぐために--batchを追加する)

--batchオプションを追加する必要がある場合があります。

GPGのバージョン2以降は、プロンプトを表示しないようにするためにオプション--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
42
F. Hauri

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オプションを無視するこの動作は、バグがない場合は本当にバグです)

31
Xen2050

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

15
rsaw

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
9
kaho lau

私にとって、「-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
9

それは私にとって魔法のように機能しました:

echo "YOUR_PASS_PHRASE" | gpg --batch --yes  --passphrase-fd 0 /home/somewhere/your_file.pgp
4
grepit
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
4
jas-

やってみましたか:

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

出典: ここ

2
abhixec

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>
1
Sumit Singh

パスワードをコマンドラインに渡す非常に安全な方法はこれだと思います:

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

これにより、「echo」コマンドが生成され、ファイル記述子がパス名としてgpgに渡されます(/ dev/fd/63など)。次に、gpgはそこからキーを読み取ります。それまでの間、echoコマンドは並行して実行され、fdのバッファにキーを残して即座に終了する必要があります。

利点は次のとおりです。

  • Gpgコマンドのコマンドラインにはパスワードがありません
  • エコーは短命です。実際、それはほぼ瞬時に
  • パスワードはディスク上に存在することはなく、削除されるファイルはありません。コマンドが中断された場合、残り物はありません。
1
V13

私がubuntuでgpgが$ DISPLAYが設定されている場合はパスワードを要求し、設定を解除した場合はコマンドライン--passwordからパスワードを取得しようとすると、あなたは私を信じません。これは期待どおりに動作します:

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

エンジニアリングの過剰のもう1つの例だと思います。

1
badburger

ここに link からstackoverflowへの回答があります。 GnuPGがパスフレーズに非常に厳しいため、--passphraseのみという難しい方法を学びましたまれに動作します。代わりに、--passphrase-fdオプションの信頼性を高めてください。

これは scriptproperを使用して--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
S0AndS0

~/.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
Felipe

Linuxマシンで動作していることがわかった1つの簡単な方法は、次のとおりです。1)キーをgpgにインポートします:=> Shell> gpg —import private_key.key

2)暗号化して出力ファイル名を与える:=> Shell> gpg —output -d

2.1)上記のコマンドを入力すると、言い換えを入力するように求められます。言い換えを入力すると、gpgファイルが復号化されます。

0
Mohit Gupta
gpg2 -se --passphrase yourpassword --batch --yes -r [email protected] filename
0
KP Singh

ubuntu 18.04の場合、これは私のために働きました-

暗号化:

pass='123'

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

復号化:

gpg some-file.tgz.gpg
0
kabanus