gpg meminta kata sandi bahkan dengan --passphrase


65

Saya mengharapkan perintah berikut untuk mengekstrak file gpg tanpa meminta kata sandi:

  gpg --passphrase 1234 file.gpg

Tetapi meminta kata sandi. Mengapa?

Ini juga memiliki perilaku yang sama:

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

Saya menggunakan Ubuntu dengan gnome 3, dan ingat itu bekerja di Fedora


1
Apakah Anda yakin gpgmenjalankan perintah yang benar, bukan alias atau pembungkus? Coba /usr/bin/gpg --passphrase 1234 file.gpg, type gpg, gpg --versiondanset | grep '^.\{0,9\}PG'
F. Hauri

Sebagai catatan, jika Anda menggunakan versi lama GPG, itu seharusnya bekerja (di Ubuntu dan semacamnya, ini adalah paket gnupg1. Namun, mereka tidak menyarankan untuk menggunakannya kecuali Anda harus
Shule

Perhatikan juga bahwa di GPG 2.x gpg --list-packets --batch myFile.gpgmeminta frasa sandi, sementara itu tidak di GPG 1.x. Itu masalah saya (dalam program yang saya tulis), sementara saya pikir saya punya masalah Anda (paket --list-pack dieksekusi terlebih dahulu, sebelum mencoba mendekripsi, dan saya tidak memperhatikan). Jadi, saya membuat cara baru untuk menentukan apakah file dienkripsi.
Shule

Jawaban:


58

Saya berada di kapal yang sama persis Anda (itu bekerja pada Fedora tetapi tidak Ubuntu). Ini adalah pekerjaan nyata yang saya temukan:

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

Penjelasan: Melewati 0penyebab --passphrase-fdmembaca dari STDIN bukan dari file. Jadi, pemipaan frasa sandi akan --passphrase-fdmenerima string kata sandi yang Anda tentukan.


16
menambahkan --batch --yeske atas berhasil bagi saya.
Ryan Tuck

1
Tapi kemudian saya mendapatkan masalah, jika saya ingin mengenkripsi data yang disalurkan ke gpg, misalnya echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpg. Bagaimana saya mengatasi ini?
con-f-use

2
Nah, dengan gpg versi Ubuntu, echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgsepertinya berfungsi.
con-f-use

1
Saya mendapatkan Inappropriate ioctl for devicedengan dan tanpa di --batchsini (di gpg (GnuPG) 2.1.18).
Nico Schlömer

2
@RyanGriggs kurasa tidak. echo "hello" | catdan echo "hello"| catkeduanya menghasilkan string yang sama.
Torsten Bronger

36

Ditingkatkan 2017-12-04. (Menambahkan --batch untuk mencegah permintaan frasa sandi)

Anda mungkin harus menambahkan --batchopsi:

Dari versi 2 GPG, opsi --batchdiperlukan untuk memastikan tidak ada konfirmasi ... Oke, cari yang:

$ 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

Mencoba:

$ 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

kedengarannya bagus! Baik sekarang:

$ 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

Meskipun tidak ada -dparameter yang diberikan (sintaksis yang sama dengan pertanyaan SO), data yang didekripsi dari file.gpgakan diekstraksi ke yang baru 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

Ini bekerja dengan baik!

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

Anda tidak mendapatkan peringatan "gpg: gpg-agent tidak tersedia di sesi ini" jadi Anda mungkin memiliki frasa sandi yang disimpan dalam agen, mungkin?
Asfand Qazi

@ AsfandYarQazi Tidak, frasa sandi dimasukkan dalam baris perintah.
F. Hauri

Jawaban ini berhasil untuk saya. Ubuntu dengan gpg 1.4.16. The --passphraseparameter bekerja untuk operasi batch, dan tidak meminta password.
Trevor Sullivan

Ini mungkin terlihat berhasil karena agen gpg yang mengganggu sedang meng-cache passphrase. Coba reboot sistem sepenuhnya dan mulai segar, atau masukkan salah - passphrase 5678 (passphrase salah).
yahermann

@yahermann: Baru dicoba sekarang unset GPG_AGENT_INFOdan bahkan GPG_AGENT_INFO=/dev/null, ini (terus) berfungsi ... Mungkin tidak disetel $GPG_AGENT_INFOdapat membantu !? (Beri tahu kami; tolong jawab, saya akan mengedit jika ini membantu!)
F. Hauri

22

Untuk gpg versi 2.x Anda tidak perlu menggunakan --batch, cukup

--pinentry-mode loopback  

bekerja dengan --passphrase& --passphrase-file, dan akan membiarkan Anda memasukkan info baru, jika terjadi konflik nama file misalnya:

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

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

tidak seperti --batchitu akan cepat gagal, mengatakan...failed: File exists

(diuji pada Debian Stabil / Peregangan ini gpg 2.1.18. Perilaku ini mengabaikan penting --passphrasepilihan benar-benar harus bug, jika tidak sudah)


1
Ini berfungsi dengan baik juga di Ubuntu 18.04 Bionic dengan gpg (GnuPG) 2.2.4
Disassembler

Ini berfungsi pada MacOS setelah menginstal gpg dengan homebrew
Joel

15

Sepertinya Anda menggunakan gpg2. Anda perlu melempar --batchopsi juga. (Jika Anda berencana untuk menambahkan ini ke skrip, Anda juga ingin menambahkan --no-ttydan mungkin --yes.)


3
Ini 1.4. menggunakan --batch tidak berpengaruh.
Omid

Maaf kalau begitu @Nima. Saya tidak tahu harus berkata apa. Dengan GnuPG v1.4 Anda tidak perlu melakukan apa pun untuk meneruskan frasa sandi dengan salah satu opsi tersebut.
rsaw

Catatan bagus, @rsaw, membantu saya mencegah permintaan kata sandi (dan opsi echo / STDIN yang sedikit kurang elegan).
ryanm

--batch membantu bahkan di windows. Woo hoo.
Dosa

9

bagi saya, menambahkan "--tidak-gunakan-agen" memecahkan ini untuk "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

Jika menggunakan gpg (GnuPG) 2.2.7 Menurut halaman manual,

--passphrase-fd n

Baca frasa sandi dari deskriptor file n. Hanya baris pertama yang akan dibaca dari file descriptor n. Jika Anda menggunakan 0 untuk n, frasa sandi akan dibaca dari STDIN. Ini hanya dapat digunakan jika hanya satu frasa sandi yang disediakan.

--passphrase-file file

Baca frasa sandi dari file file. Hanya baris pertama yang akan dibaca dari file file. Ini hanya dapat digunakan jika hanya satu frasa sandi yang disediakan. Jelas, frasa sandi yang disimpan dalam file adalah keamanan yang dipertanyakan jika pengguna lain dapat membaca file ini. Jangan gunakan opsi ini jika Anda bisa menghindarinya.

--assphrase string

Gunakan string sebagai frasa sandi. Ini hanya dapat digunakan jika hanya satu frasa sandi yang disediakan. Jelas, ini adalah keamanan yang sangat dipertanyakan pada sistem multi-pengguna. Jangan gunakan opsi ini jika Anda bisa menghindarinya.

tambahkan --pinentry-mode loopbackuntuk bekerja

Perhatikan bahwa sejak Versi 2.0 frasa sandi ini hanya digunakan jika opsi --batch juga telah diberikan. Karena Versi 2.1 --pinentry-mode juga perlu diatur ke loopback.

Sebagai contoh:

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

Apakah opsi --batchdan yang --pinentry-mode loopbackdibutuhkan untuk setiap --passphrase ... opsi untuk bekerja? Pada v.2.1.18 halaman info mengatakan hal yang sama (tetapi bukan halaman manual) tentang batch & pinentry diperlukan, tetapi masih bekerja dengan hanya --pasokan ... Jika keduanya benar-benar diperlukan untuk v.2.2.7 maka semuanya semakin konyol, pengembang sengaja memperkenalkan bug serius
Xen2050

4

Itu bekerja seperti sulap bagi saya:

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

error: gpg: no valid OpenPGP data found. gpg: processing message failed: eof. Ada ide?
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

Sudahkah Anda mencoba melakukan:

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

Sumber: Di sini


1

Saya pikir metode yang cukup aman untuk meneruskan kata sandi ke baris perintah adalah ini:

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

Apa yang akan dilakukan adalah menelurkan perintah "echo" dan meneruskan deskriptor file sebagai nama jalur ke gpg (misalnya / dev / fd / 63). gpg kemudian akan membaca kunci dari sana. Sementara itu, perintah echo harus berjalan secara paralel dan harus selesai secara instan, meninggalkan kunci pada buffer fd.

Manfaatnya adalah:

  • Perintah gpg tidak akan memiliki kata sandi di baris perintahnya
  • Gema akan berumur pendek. Bahkan, itu harus hampir instan
  • Kata sandi tidak akan pernah berada di disk, tidak akan ada file yang akan dihapus dan jika perintah terputus tidak akan ada sisa makanan

1

Anda tidak akan percaya ketika saya memberi tahu Anda bahwa di ubuntu gpg mencoba menanyakan kata sandi Anda jika $ DISPLAY disetel dan mengambilnya dari commandline --password jika Anda tidak menyetelnya. Ini berfungsi seperti yang diharapkan:

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

Contoh lain dari teknik yang berlebihan saya kira.


1

Berikut ini tautan ke jawaban stackoverflow yang mungkin dapat bantuan lebih lanjut; Saya punya proyek yang melakukan dekripsi / enkripsi massal, dan karena GnuPG sangat ketat tentang frasa sandi, belajar dengan cara yang sulit yang --passphrasehanya berfungsi pada kesempatan langka. Alih-alih mempertimbangkan --passphrase-fdopsi menjadi lebih dapat diandalkan.

Ini Script membuat tepat menggunakan --passphrase -fdpilihan, dan telah diuji publik melalui Travis-CI mana Anda dapat menemukan log dari dalam tindakan.

Sekarang saya tidak akan hanya memposting tautan ke jawaban tanpa memberikan beberapa contoh kode di sini, jadi inilah skrip "berdiri sendiri" yang diperbarui yang dapat Anda mainkan:

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

Walaupun hal di atas tidak semewah perlindungan tertaut di GitHub, seharusnya lebih fungsional daripada jawaban yang ditautkan pada awal posting ini.

Selamat melakukan peretasan.


1

Seperti disebutkan dalam man gpg opsi berikut dapat digunakan

--input-mode mode Atur mode pinentry ke mode. Nilai yang diizinkan untuk mode adalah:

          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.

Jadi perilaku default gpg adalah meminta pengguna untuk frasa sandi, jika ubah mode agen pengguna ini menjadi "--pinentry-mode loopback" Ini berfungsi dengan baik. perintah lengkap

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

0

Salah satu metode sederhana yang saya temukan bekerja pada mesin linux adalah: 1) kunci impor ke gpg: => shell> gpg —import private_key.key

2) mendekripsi memberikan nama file outfile: => shell> gpg —output -d

2.1) Memberi perintah di atas akan meminta Anda untuk memasukkan parafrase. Masukkan parafrase dan itu akan mendekripsi file gpg.


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

1
alangkah baiknya jika Anda bisa menjelaskan mengapa ini harus memperbaiki masalah
Zanna

1
Sementara potongan kode ini dapat menyelesaikan pertanyaan, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, bukan hanya orang yang bertanya sekarang! Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi tentang batasan dan asumsi apa yang berlaku.
Toby Speight

0

Masukkan di akhir ~/.gnupg/gpg.conf:

use-agent
pinentry-mode loopback

Masukkan di akhir file (mungkin baru) ~/.gnupg/gpg-agent.conf:

allow-loopback-pinentry

Dan kemudian jalankan perintah ini:

echo RELOADAGENT | gpg-connect-agent

Sekarang Anda dapat menjalankan ini tanpa meminta kata sandi:

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"

Di mana $ 1 adalah teks yang akan dienkripsi, $ 2 adalah ID pengguna dan $ 3 kata sandi.

Catatan: Saya tidak ingat mengapa itu bekerja, tetapi itu berhasil. Jika Anda tahu detailnya, silakan edit dan masukkan di sini.


0

untuk Ubuntu 18.04 ini bekerja untuk saya

mengenkripsi:

pass='123'

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

dekripsi:

gpg some-file.tgz.gpg
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.