即使使用--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 --versionset | grep '^.\{0,9\}PG'
F. Hauri

只是为了记录在案,如果使用旧版本的GPG的,它应该工作(在Ubuntu和这样的,它是gnupg1包然而,他们不鼓励使用它,除非你要。。
疏勒河

另请注意,在GPG 2.x中gpg --list-packets --batch myFile.gpg提示输入密码,而在GPG 1.x中则不提示。那是我的问题(在我正在编写的程序中),而我以为我遇到了问题(在尝试解密之前先执行--list-packets东西,但我没有注意到)。因此,我采用了一种新方法来确定文件是否已加密。
Shule

Answers:


57

我在同一条船上(它在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。我该如何解决?
混淆使用

2
好吧,使用gpg的Ubuntu版本,echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpg似乎可以正常工作。
混淆使用

1
我在这里Inappropriate ioctl for device有无--batch(在gpg(GnuPG)2.1.18上)。
NicoSchlömer'17

2
@RyanGriggs我不这么认为。echo "hello" | catecho "hello"| cat产生相同的字符串。
Torsten Bronger

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在此会话中不可用”的警告,因此您可能已将密码存储在代理中,也许吗?
阿斯凡德·卡兹

@AsfandYarQazi不,密码是在命令行中输入的。
F. Hauri 2015年

这个答案对我有用。使用gpg 1.4.16的Ubuntu。该--passphrase参数适用于批处理操作,不提示输入密码。
Trevor Sullivan

由于恼人的gpg-agent正在缓存密码,因此这似乎可行。尝试完全重新引导系统并重新启动,或者输入错误的密码短语5678(错误的密码短语)。
yahermann

@yahermann:现在unset GPG_AGENT_INFO甚至以后都尝试过GPG_AGENT_INFO=/dev/null,这个(继续)工作...也许设置$GPG_AGENT_INFO可能会有所帮助!(让我们知道;请回答,如果有帮助,我会编辑!)
F. Hauri

21

对于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仿生与GPG(GnuPG的)2.2.4
反汇编

在使用自制软件安装gpg后,此功能可在MacOS上使用
Joel

15

听起来您正在使用gpg2。您还需要抛出该--batch选项。(如果您打算将其添加到脚本中,则还--no-tty可能要添加并且可能是--yes。)


3
是1.4。使用--batch无效。
2013年

抱歉@Nima。我不知道该怎么说 使用GnuPG v1.4,您无需执行任何其他操作即可通过其中两个选项来传递密码。
rsaw 2013年

很好的提示,@ rsaw,帮助我防止了密码提示(和不太优雅的echo / STDIN选项)。
ryanm

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

7

如果使用gpg(GnuPG)2.2.7,根据手册页,

--passphrase-fd n

从文件描述符n中读取密码。从文件描述符n中仅读取第一行。如果对n使用0,则将从STDIN读取密码。仅在仅提供一个密码短语的情况下才能使用此功能。

--passphrase-file文件

从文件文件中读取密码。从文件file中仅读取第一行。仅在仅提供一个密码短语的情况下才能使用此功能。显然,如果其他用户可以读取该文件,则存储在文件中的密码短语的安全性值得怀疑。如果可以避免,请不要使用此选项。

--passphrase字符串

使用字符串作为密码短语。仅在仅提供一个密码短语的情况下才能使用此功能。显然,这在多用户系统上的安全性值得怀疑。如果可以避免,请不要使用此选项。

添加--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的相同信息(但不是手册页),但仍仅与--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选项,并已通过公开测试特拉维斯-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模式将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)导入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
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答问题,而不仅仅是现在问的人!请编辑您的答案以添加解释,并指出适用的限制和假设。
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是用户ID,$ 3是密码。

注意:我不记得它为什么起作用,但是它起作用。如果您知道详细信息,请在此处编辑并插入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.