gpg ขอรหัสผ่านแม้จะมี - passphrase


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.gpg, type gpg, gpg --versionและset | grep '^.\{0,9\}PG'
เอฟ HAURI

สำหรับบันทึกถ้าคุณใช้ GPG เวอร์ชันเก่ามันควรจะทำงานได้ (บน Ubuntu และเช่นนั้นเป็นแพ็คเกจ gnupg1 อย่างไรก็ตามพวกเขาไม่แนะนำให้ใช้หากคุณไม่จำเป็นต้องใช้มัน
Shule

นอกจากนี้โปรดทราบว่าใน GPG 2.x gpg --list-packets --batch myFile.gpgพร้อมท์ให้ใส่ข้อความรหัสผ่านในขณะที่ไม่ได้อยู่ใน GPG 1.x นั่นคือปัญหาของฉัน (ในโปรแกรมที่ฉันกำลังเขียน) ในขณะที่ฉันคิดว่าฉันมีปัญหาของคุณ (- รายการสิ่งที่แพ็คเก็ตดำเนินการก่อนที่จะพยายามถอดรหัสและฉันไม่ได้สังเกตเห็น) ดังนั้นฉันจึงสร้างวิธีการใหม่เพื่อตรวจสอบว่ามีการเข้ารหัสไฟล์หรือไม่
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ไปยังทำงานข้างต้นสำหรับฉัน
Ryan Tuck

1
แต่แล้วฉันจะได้รับปัญหาถ้าผมต้องการที่จะเข้ารหัสข้อมูลที่ถูกประปาเข้า gpg echo "encrypt me" | gpg --passphrarse "mypw" -c -o test.gpgเช่น ฉันจะแก้ปัญหานี้ได้อย่างไร
con-f-use

2
ด้วย gpg เวอร์ชัน Ubuntu echo "encrypt me" | gpg --passphrase "mypassphrase" --batch --quiet --yes --no-use-agent -c -o encrypted.gpgดูเหมือนว่าจะใช้งานได้
con-f-use

1
ฉันจะไปInappropriate ioctl for deviceด้วยและไม่--batchอยู่ที่นี่ (บน gpg (GnuPG) 2.1.18)
Nico Schlömer

2
@RyanGriggs ฉันไม่คิดอย่างนั้น echo "hello" | catและecho "hello"| catทั้งคู่ให้ผลลัพธ์สตริงเดียวกัน
Torsten Bronger

36

อัปเกรดแล้ว 2017-12-04 (การเพิ่ม - แบทช์เพื่อป้องกันข้อความรหัสผ่าน)

คุณอาจต้องเพิ่ม--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พารามิเตอร์ที่กำหนด (syntaxe เดียวกับคำถามของ SO) ถอดรหัสข้อมูลจากจะถูกแยกไปอยู่ที่ใหม่file.gpgfile

$ 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. Hauri

คำตอบนี้ใช้ได้สำหรับฉัน Ubuntu พร้อม gpg 1.4.16 --passphraseพารามิเตอร์การทำงานสำหรับการดำเนินงานชุดและไม่ได้แจ้งให้ใส่รหัสผ่าน
Trevor Sullivan

นี้อาจปรากฏในการทำงานเพราะ gpg ตัวแทนน่ารำคาญเป็นแคชรหัสผ่าน ลองรีบูตระบบอย่างสมบูรณ์และเริ่มต้นใหม่หรือป้อน --passphrase 5678 ผิด (รหัสผ่านไม่ถูกต้อง)
yahermann

@yahermann: ลองตอนนี้unset GPG_AGENT_INFOแม้กระทั่งหลังจากGPG_AGENT_INFO=/dev/nullนี้ (ต่อไป) เพื่อทำงาน ... บางทีการตั้งค่า$GPG_AGENT_INFOอาจช่วยได้! (แจ้งให้เราทราบโปรดตอบฉันจะแก้ไขหากความช่วยเหลือนี้!)
F. Hauri

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

(ทดสอบกับ gpg Debian Stable / Stretch ของ 2.1.18 พฤติกรรมการละเลย--passphraseตัวเลือกที่สำคัญนี้ควรเป็นข้อผิดพลาดหากยังไม่ได้ดำเนินการ)


1
สิ่งนี้ทำงานได้ดีบน Ubuntu 18.04 ไบโอนิคกับ gpg (GnuPG) 2.2.4
Disassembler

ใช้งานได้กับ MacOS หลังจากติดตั้ง gpg ด้วย homebrew
Joel

15

ดูเหมือนว่าคุณกำลังใช้ gpg2 คุณต้องโยน--batchตัวเลือกเช่นกัน (หากคุณวางแผนที่จะเพิ่มสิ่งนี้ลงในสคริปต์คุณจะต้องเพิ่มเข้าไปด้วย--no-ttyและอาจจะ--yes)


3
มันคือ 1.4 ใช้ - แบทช์ไม่มีผลกระทบ
Omid

ขออภัยด้วย @Nima ฉันไม่รู้จะบอกอะไรคุณ ด้วย GnuPG v1.4 คุณไม่จำเป็นต้องทำสิ่งใดเพื่อส่งข้อความรหัสผ่านด้วยตัวเลือกเหล่านั้น
rsaw

ขอขอบคุณ @rsaw ช่วยฉันป้องกันการแจ้งเตือนรหัสผ่าน (และตัวเลือก echo / STDIN ที่หรูหรากว่านี้เล็กน้อย)
ryanm

- ชุดช่วยแม้ใน windows เกี้ยว
Sin

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 เฉพาะบรรทัดแรกเท่านั้นที่จะอ่านจาก file descriptor n หากคุณใช้ 0 สำหรับ n ข้อความรหัสผ่านจะถูกอ่านจาก STDIN สามารถใช้งานได้ก็ต่อเมื่อมีการจัดส่งวลีรหัสผ่านเดียวเท่านั้น

- ข้ามไฟล์ไฟล์

อ่านข้อความรหัสผ่านจากไฟล์ไฟล์ เฉพาะบรรทัดแรกเท่านั้นที่จะอ่านจากไฟล์ไฟล์ สามารถใช้งานได้ก็ต่อเมื่อมีการจัดส่งวลีรหัสผ่านเดียวเท่านั้น เห็นได้ชัดว่าข้อความรหัสผ่านที่เก็บไว้ในไฟล์นั้นมีความปลอดภัยที่น่าสงสัยหากผู้ใช้รายอื่นสามารถอ่านไฟล์นี้ได้ อย่าใช้ตัวเลือกนี้หากคุณสามารถหลีกเลี่ยงได้

- วลีรหัสผ่าน

ใช้สตริงเป็นข้อความรหัสผ่าน สามารถใช้งานได้ก็ต่อเมื่อมีการจัดส่งวลีรหัสผ่านเดียวเท่านั้น เห็นได้ชัดว่านี่เป็นความปลอดภัยที่น่าสงสัยมากในระบบที่มีผู้ใช้หลายคน อย่าใช้ตัวเลือกนี้หากคุณสามารถหลีกเลี่ยงได้

เพิ่ม--pinentry-mode loopbackเพื่อที่จะทำงาน

โปรดทราบว่าตั้งแต่เวอร์ชัน 2.0 ข้อความรหัสผ่านนี้จะใช้เฉพาะในกรณีที่ได้รับตัวเลือก - แบทช์ด้วย ตั้งแต่เวอร์ชัน 2.1 - โหมด pinpin ต้องมีการตั้งค่าเป็น loopback

ตัวอย่างเช่น:

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

มีทั้ง--batchและ--pinentry-mode loopbackตัวเลือกที่จำเป็นสำหรับ --passphrase ... ใด ๆ ตัวเลือกในการทำงานหรือไม่ ใน v.2.1.18 หน้าข้อมูลบอกสิ่งเดียวกัน (แต่ไม่ใช่หน้าคน) เกี่ยวกับแบทช์ & พินเทอร์ที่ต้องการ แต่ก็ยังใช้งานได้กับ - พินแชร์เท่านั้น ... หากทั้งสองจำเป็นสำหรับ v.2.2.7 จริงๆ นักพัฒนากำลังแนะนำข้อผิดพลาดร้ายแรงตามวัตถุประสงค์
Xen2050


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" และส่งไฟล์ descriptor เป็นชื่อพา ธ ไปยัง gpg (เช่น / dev / fd / 63) gpg จะอ่านรหัสจากที่นั่น ในเวลาเฉลี่ยคำสั่ง echo ควรรันแบบขนานและควรเสร็จทันทีโดยปล่อยปุ่มบนบัฟเฟอร์ของ fd

ประโยชน์คือ:

  • คำสั่ง gpg จะไม่มีรหัสผ่านในบรรทัดคำสั่ง
  • เสียงสะท้อนจะมีอายุสั้น ในความเป็นจริงมันควรจะเกือบจะทันที
  • รหัสผ่านจะไม่อยู่ในดิสก์จะไม่มีไฟล์ที่จะลบและหากคำสั่งถูกขัดจังหวะจะไม่มีสิ่งที่เหลืออยู่

1

คุณจะไม่เชื่อฉันเมื่อฉันบอกคุณว่าใน ubuntu gpg พยายามที่จะถามรหัสผ่านของคุณถ้ามีการตั้งค่า $ DISPLAY และรับจาก commandline - รหัสผ่านถ้าคุณไม่ได้ตั้งค่า ใช้งานได้ตามที่คาดไว้:

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

ฉันเดาอีกตัวอย่างหนึ่ง


1

นี่คือลิงก์ไปยังคำตอบแบบสแต็คโอเวอร์โฟลว์ที่อาจช่วยได้อีก ฉันมีโครงการที่ถอดรหัส / เข้ารหัสเป็นกลุ่มและเนื่องจากGnuPGมีความเข้มงวดมากเกี่ยวกับข้อความรหัสผ่านเรียนรู้วิธีที่ยากลำบากที่--passphraseใช้งานได้เฉพาะในโอกาสที่หายาก พิจารณา--passphrase-fdตัวเลือกที่จะเชื่อถือได้มากขึ้นแทน

นี้สคริปต์ทำให้เหมาะสมการใช้งานของ--passphrase -fdตัวเลือกและได้รับการทดสอบแบบสาธารณะผ่านเทรวิส-CIที่คุณสามารถหาบันทึกของมันในการดำเนินการ

ตอนนี้ฉันจะไม่โพสต์ลิงก์ไปยังคำตอบโดยไม่ต้องให้โค้ดตัวอย่างที่นี่ดังนั้นนี่คือสคริปต์ "stand alone" ที่อัปเดตแล้วที่คุณสามารถเล่นกับ:

#!/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 ตัวเลือกต่อไปนี้สามารถใช้ได้

- โหมดพินทรีโหมดตั้งโหมดพินทรีเป็นโหมด ค่าที่อนุญาตสำหรับโหมดคือ:

          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.

พฤติกรรมเริ่มต้นของ gpg คือให้ผู้ใช้ใส่ข้อความรหัสผ่านหากเปลี่ยนโหมดตัวแทนผู้ใช้เป็น "--pinentry-mode loopback" มันทำงานได้อย่างสมบูรณ์แบบ คำสั่งที่สมบูรณ์

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

0

วิธีการง่ายๆที่ฉันพบว่าทำงานบนเครื่อง linux คือ: 1) อิมพอร์ต key ไปที่ gpg: => shell> gpg --import private_key.key

2) ถอดรหัสให้ชื่อ outfile: => 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

หมายเหตุ: ฉันจำไม่ได้ว่าทำไมมันถึงได้ผล แต่ใช้งานได้ หากคุณทราบรายละเอียดโปรดแก้ไขและใส่ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.