gpg yêu cầu mật khẩu ngay cả với --passphrase


65

Tôi mong đợi lệnh sau để giải nén tệp gpg mà không yêu cầu mật khẩu:

  gpg --passphrase 1234 file.gpg

Nhưng nó yêu cầu mật khẩu. Tại sao?

Điều này cũng có hành vi tương tự:

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

Tôi sử dụng Ubuntu với gnome 3 và nhớ rằng nó đang hoạt động ở Fedora


1
Bạn có chắc chắn gpgchạy đúng lệnh, không phải bí danh cũng không phải là trình bao bọc? Hãy thử /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versionset | grep '^.\{0,9\}PG'
F. Hauri

Chỉ để ghi lại, nếu bạn sử dụng phiên bản GPG cũ, nó sẽ hoạt động (trên Ubuntu và như vậy, đó là gói gnupg1. Tuy nhiên, họ không khuyến khích sử dụng trừ khi bạn phải.
Shule

Cũng lưu ý rằng trong GPG 2.x gpg --list-packets --batch myFile.gpgsẽ nhắc một cụm mật khẩu, trong khi nó không có trong GPG 1.x. Đó là vấn đề của tôi (trong một chương trình mà tôi đang viết), trong khi tôi nghĩ rằng tôi có vấn đề của bạn (điều --list-gói được thực thi trước, trước khi thử giải mã và tôi đã không nhận thấy). Vì vậy, tôi đã thực hiện một cách mới để xác định xem các tệp có được mã hóa hay không.
Shule

Câu trả lời:


58

Tôi đang ở trong cùng một chiếc thuyền của bạn (nó hoạt động trên Fedora nhưng không phải Ubuntu). Đây là một công việc rõ ràng xung quanh tôi phát hiện ra:

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

Giải thích: Truyền các 0nguyên nhân --passphrase-fdđể đọc từ STDIN chứ không phải từ một tệp. Vì vậy, sử dụng cụm mật khẩu sẽ --passphrase-fdchấp nhận chuỗi mật khẩu được chỉ định của bạn.


16
thêm --batch --yesvào ở trên làm việc cho tôi.
Ryan Tuck

1
Nhưng sau đó tôi gặp một vấn đề, nếu tôi muốn mã hóa dữ liệu được dẫn vào gpg, vd echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Tôi giải quyết điều này như thế nào?
con-f-use

2
Vâng, với phiên bản Ubuntu của gpg, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgdường như hoạt động.
con-f-sử dụng

1
Tôi đang Inappropriate ioctl for devicecó và không có --batchở đây (trên gpg (GnuPG) 2.1.18).
Nico Schlömer

2
@RyanGriggs Tôi không nghĩ vậy. echo "hello" | catecho "hello"| catcả hai đều mang lại cùng một chuỗi.
Torsten Bronger

36

Nâng cấp 2017-12-04. (Thêm --batch để ngăn lời nhắc cụm mật khẩu)

Bạn có thể phải thêm --batchtùy chọn:

Từ phiên bản 2 trở đi GPG, tùy chọn --batchlà cần thiết để đảm bảo không có dấu nhắc ... Ok, tìm kiếm rằng:

$ 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

Cố gắng:

$ 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

Nghe hay đấy! Chà, bây giờ:

$ 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

Mặc dù không có -dtham số nào được đưa ra (cùng cú pháp như câu hỏi của SO), các dữ liệu được giải mã từ file.gpgsẽ được trích xuất sang một tham số mới 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

Công việc này tốt!

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

Bạn không nhận được cảnh báo "gpg: gpg-agent không có sẵn trong phiên này", vì vậy bạn có thể có cụm mật khẩu được lưu trong tác nhân, có lẽ?
Asfand Qazi

@AsfandYarQazi Không, cụm mật khẩu được nhập vào dòng lệnh.
F. Hauri

Câu trả lời này đã làm việc cho tôi. Ubuntu với gpg 1.4.16. Các --passphrasethông số làm việc cho các hoạt động hàng loạt, và không nhắc nhập mật khẩu.
Trevor Sullivan

Điều này có thể xuất hiện để làm việc vì gây phiền nhiễu gpg-agent là bộ nhớ đệm cụm từ mật khẩu. Hãy thử khởi động lại hệ thống hoàn toàn và bắt đầu mới hoặc nhập sai - cụm từ 5678 (cụm mật khẩu sai).
yahermann

@yahermann: Chỉ cần thử ngay bây giờ unset GPG_AGENT_INFOvà thậm chí GPG_AGENT_INFO=/dev/null, điều này (tiếp tục) hoạt động ... Có lẽ việc không đặt cược $GPG_AGENT_INFOcó thể giúp đỡ!? (Hãy cho chúng tôi biết; vui lòng trả lời, tôi sẽ chỉnh sửa nếu trợ giúp này!)
F. Hauri

22

Đối với gpg phiên bản 2.x bạn không cần sử dụng --batch, chỉ cần

--pinentry-mode loopback  

hoạt động với --passphrase& --passphrase-file, và sẽ cho phép bạn nhập thông tin mới, trong trường hợp xung đột tên tệp chẳng hạn:

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

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

Không giống như --batchđiều đó sẽ nhanh chóng thất bại, nói...failed: File exists

(đã thử nghiệm trên gpg Debian Stable / Stretch's 2.1.18. Hành vi bỏ qua --passphrasecác tùy chọn quan trọng này thực sự sẽ là một lỗi, nếu nó chưa xảy ra)


1
Điều này cũng hoạt động độc đáo trên Ubuntu 18.04 Bionic với gpg (GnuPG) 2.2.4
Disassembler

Điều này hoạt động trên MacOS sau khi cài đặt gpg với homebrew
Joel

15

Có vẻ như bạn đang sử dụng gpg2. Bạn cần phải ném vào --batchtùy chọn là tốt. (Nếu bạn dự định thêm phần này vào tập lệnh, bạn cũng sẽ muốn thêm --no-ttyvà có thể --yes.)


3
Đó là 1.4. sử dụng --batch không có hiệu lực.
Omid

Xin lỗi sau đó @Nima. Tôi không biết phải nói gì với bạn. Với GnuPG v1.4, bạn không cần phải làm gì khác để chuyển cụm mật khẩu với một trong các tùy chọn đó.
rsaw

Lưu ý tốt, @rsaw, đã giúp tôi ngăn lời nhắc mật khẩu (và tùy chọn echo / STDIN hơi kém thanh lịch).
ryanm

--batch đã giúp ngay cả trong các cửa sổ. woo hoo.
Tội lỗi

9

đối với tôi, việc thêm "--no-use-agent" đã giải quyết điều này cho "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

Nếu sử dụng gpg (GnuPG) 2.2.7 Theo trang man,

--passphrase-fd n

Đọc cụm mật khẩu từ mô tả tập tin n. Chỉ dòng đầu tiên sẽ được đọc từ mô tả tập tin n. Nếu bạn sử dụng 0 cho n, cụm mật khẩu sẽ được đọc từ STDIN. Điều này chỉ có thể được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp.

tập tin --passphrase

Đọc cụm mật khẩu từ tệp tập tin. Chỉ dòng đầu tiên sẽ được đọc từ tệp tập tin. Điều này chỉ có thể được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp. Rõ ràng, một cụm mật khẩu được lưu trữ trong một tệp có tính bảo mật đáng ngờ nếu người dùng khác có thể đọc tệp này. Đừng sử dụng tùy chọn này nếu bạn có thể tránh nó.

- chuỗi cụm từ

Sử dụng chuỗi làm mật khẩu. Điều này chỉ có thể được sử dụng nếu chỉ có một cụm mật khẩu được cung cấp. Rõ ràng, đây là bảo mật rất đáng nghi ngờ trên một hệ thống nhiều người dùng. Đừng sử dụng tùy chọn này nếu bạn có thể tránh nó.

thêm --pinentry-mode loopbackvào để làm việc

Lưu ý rằng vì Phiên bản 2.0, cụm mật khẩu này chỉ được sử dụng nếu tùy chọn --batch cũng đã được cung cấp. Kể từ Phiên bản 2.1, chế độ --pinentry cũng cần được đặt thành loopback.

Ví dụ:

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

Cả hai --batch--pinentry-mode loopbackcác tùy chọn cần thiết cho bất kỳ tùy chọn --passphrase ... có hoạt động không? Trên v.2.1.18, trang thông tin nói điều tương tự (nhưng không phải trang man) về lô & pinentry cần thiết, nhưng vẫn chỉ hoạt động với --pinentry ... Nếu cả hai thực sự cần thiết cho v.2.2.7 thì mọi thứ đang trở nên lố bịch, các nhà phát triển đang giới thiệu các lỗi nghiêm trọng về mục đích
Xen2050

4

Nó hoạt động như ma thuật đối với tôi:

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

lỗi : gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Có ý kiến ​​gì không?
Gabriel Staples

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

bạn đã thử làm chưa:

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

Nguồn: Tại đây


1

Tôi nghĩ rằng một phương pháp khá an toàn để truyền mật khẩu vào dòng lệnh là:

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

Điều này sẽ làm là sinh ra lệnh "echo" và truyền một bộ mô tả tệp dưới dạng tên đường dẫn đến gpg (ví dụ / dev / fd / 63). gpg sau đó sẽ đọc chìa khóa từ đó. Trong thời gian trung bình, lệnh echo sẽ chạy song song và kết thúc ngay lập tức, để lại khóa trên bộ đệm của fd.

Lợi ích là:

  • Lệnh gpg sẽ không có mật khẩu trên dòng lệnh của nó
  • Tiếng vang sẽ được sống ngắn. Trong thực tế, nó sẽ gần như ngay lập tức
  • Mật khẩu sẽ không bao giờ nằm ​​trên đĩa, sẽ không có tệp nào bị xóa và nếu lệnh bị gián đoạn sẽ không có phần còn lại

1

Bạn sẽ không tin tôi khi tôi nói với bạn rằng trên ub Ubuntu gpg cố gắng hỏi mật khẩu của bạn nếu $ HIỂN THỊ được đặt và lấy nó từ dòng lệnh - mật khẩu nếu bạn bỏ đặt nó. Điều này hoạt động như mong đợi:

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

Tôi đoán chỉ là một ví dụ khác về kỹ thuật.


1

Đây là một liên kết đến một câu trả lời stackoverflow có thể hỗ trợ thêm; Tôi có một dự án thực hiện giải mã / mã hóa hàng loạt và do GnuPG rất nghiêm ngặt về cụm mật khẩu, đã học được cách khó --passphrasechỉ hoạt động trong những dịp hiếm hoi. Thay vào đó hãy xem xét --passphrase-fdlựa chọn để đáng tin cậy hơn.

Đây kịch bản làm cho thích hợp sử dụng các --passphrase -fdtùy chọn, và đã được thử nghiệm công khai qua Travis-CI , nơi bạn có thể tìm thấy các bản ghi của nó trong hành động.

Bây giờ tôi sẽ không chỉ đăng các liên kết đến một câu trả lời mà không cung cấp một số mã ví dụ ở đây, vì vậy đây là một kịch bản "độc lập" được cập nhật mà bạn có thể chơi với:

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

Trong khi ở trên không phải là ưa thích như liên kết bảo vệ tại GitHub nó nên được thậm chí nhiều hơn chức năng hơn so với câu trả lời liên quan ở phần đầu của bài viết này.

Chúc mừng hack.


1

Như đã đề cập trong man gpg tùy chọn sau đây có thể được sử dụng

chế độ --pinentry-mode Đặt chế độ pinentry thành chế độ. Các giá trị được phép cho chế độ là:

          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.

Vì vậy, hành vi mặc định của gpg là nhắc người dùng nhập cụm mật khẩu, nếu thay đổi chế độ tác nhân người dùng này thành "- loopent-mode loopback" Nó hoạt động hoàn toàn tốt. hoàn thành lệnh

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

0

Một phương pháp đơn giản tôi thấy làm việc trên máy linux là: 1) nhập khóa vào gpg: => shell> gpg Nottimport private_key.key

2) giải mã đưa ra tên outfile: => shell> gpg Troutoutput -d

2.1) Đưa ra lệnh trên sẽ nhắc bạn nhập paraph khẩu. Nhập paraph khẩu và nó sẽ giải mã tập tin gpg.


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

1
sẽ thật tuyệt nếu bạn có thể giải thích lý do tại sao điều này sẽ khắc phục vấn đề
Zanna

1
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai, không chỉ là người hỏi bây giờ! Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Toby Speight

0

Đặt ở cuối ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Đặt ở cuối tệp (có thể mới) ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

Và sau đó chạy lệnh này:

echo RELOADAGENT | gpg-connect-agent

Bây giờ bạn có thể chạy nó mà không cần hỏi mật khẩu:

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"

Trong đó $ 1 là văn bản được mã hóa, $ 2 là ID người dùng và $ 3 mật khẩu.

Lưu ý: Tôi không thể nhớ tại sao nó hoạt động, nhưng nó hoạt động. Nếu bạn biết chi tiết, xin vui lòng chỉnh sửa và chèn vào đây.


0

cho Ubuntu 18.04, nó hoạt động với tôi-

mã hóa:

pass='123'

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

giải mã:

gpg some-file.tgz.gpg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.