GPG - ตรวจสอบลายเซ็นโดยไม่สร้างห่วงโซ่ความน่าเชื่อถือ?


19

เป็นไปได้ไหมที่จะขอให้ gpg (หรือ gpg4win) เพียงตรวจสอบว่าไฟล์ถูกลงชื่อโดยไฟล์กุญแจสาธารณะโดยไม่ต้องนำเข้าและเซ็นชื่อและเชื่อถือคีย์นั้นหรือไม่?

นั่นคือสิ่งที่ชอบ

gpg --using-key pubkey.txt --verify message.txt

ซึ่งตรงข้ามกับการสร้างคีย์ส่วนตัวของคุณเองแล้วทำ

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt

1
พยายามที่จะดูว่าคำสั่งgpg --status-fd 1 --verify (thefile)ให้ในการส่งออกเป็นสตริงแรกลายนิ้วมือของคีย์ที่ทำให้ลายเซ็น
harrymc

บริบทบางอย่างที่นี่: เรามีระบบที่ลงนามสิ่งต่าง ๆ เรามอบรหัสสาธารณะให้กับผู้ที่อาจได้รับข้อความจากระบบนี้เพื่อให้พวกเขาสามารถตรวจสอบว่าข้อความไม่ได้ถูกแก้ไข อย่างไรก็ตามเราไม่ต้องการบอกให้ผู้รับ "เชื่อใจสิ่งที่เซ็นชื่อโดยคีย์นี้" เพราะจะสามารถใช้ในการตรวจสอบข้อความจากระบบอื่น ๆ (เช่นอีเมลจากเพื่อน ๆ )
OJW

ดังนั้นเราจึงต้องการให้คำสั่ง / แบทช์ไฟล์แก่คนที่ตรวจสอบว่า "gpg บอกว่าข้อความนี้ถูกส่งโดยกุญแจนี้หรือไม่" โดยไม่รบกวนการใช้ gpg ในชีวิตประจำวันสำหรับการสื่อสารกับผู้อื่น รหัสควรเชื่อถือได้เพียงเพราะบรรทัดคำสั่งร้องขอไม่ใช่เพราะ GPG ได้รับคำสั่งให้เชื่อถือเสมอ
OJW

คำตอบ:


14

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

นี่คือการทดสอบที่ฉันทำกับไฟล์ที่ลงชื่อด้วยกุญแจของฉันเอง แต่ในระบบที่ไม่ได้นำเข้ากุญแจ:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

น่าเสียดายที่ข้อเสนอแนะของแฮร์รี่ไม่ได้ผล แต่ก็มีการดึงข้อมูลเพิ่มเติมอีกเล็กน้อย แต่ไม่เพียงพอที่จะใช้งาน

ดังที่คุณเห็นข้อมูลส่วนใหญ่ที่ได้รับคือรหัสคีย์ของคีย์ย่อยที่ใช้ในการสร้างลายเซ็นและเวลาที่สร้างลายเซ็น สิ่งนี้ตรงกับข้อมูลที่มีให้ pgpdump (หรือ --list-packets):

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

อย่างที่คุณเห็นมันมีอัลกอริธึมการแฮชรายละเอียดของประเภทของคีย์ (คีย์การลงนามของฉันคือคีย์ย่อย RSA 3072 บิตและรหัสคีย์ของคีย์ย่อย แต่ไม่มีอะไรที่จะระบุคีย์หลักข้อมูลนั้นเป็นเพียง เปิดเผยเมื่อคุณมีรหัสสาธารณะและตรวจสอบลายเซ็น

จากนั้นฉันนำเข้ากุญแจสาธารณะของฉันบนระบบนั้นและลองอีกครั้ง:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

ขณะนี้สามารถระบุคีย์และจับคู่กับคีย์หลักได้ อย่างไรก็ตามมีความเป็นไปได้ที่จะลดลักษณะของคำเตือนเหล่านี้:

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

ยังคงมีคำเตือนว่ามันเป็นกุญแจที่ไม่น่าเชื่อถือ แต่ไม่หนาแน่นมากและการลบคำฟุ่มเฟื่อยเพียงลดความมัน:

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

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

หมายเหตุ: ฉันได้ปรับแต่ง UID ในตัวอย่างนี้นิดหน่อย แต่ทุกคนที่ได้รับกุญแจนั้นจะเห็นว่าพวกเขาเป็นอะไรจริงๆ มิฉะนั้นเอาต์พุตจะเป็นสำเนาและวางแบบตรง

แก้ไข: คุณสามารถเรียกไฟล์กุญแจสาธารณะโดยตรงเช่นพวงกุญแจหากคุณมีในรูปแบบหุ้มเกราะที่ไม่ใช่ ASCII (เช่นไฟล์. gpg แทนไฟล์. asg) ถึงกระนั้นคุณยังต้องใช้รหัสสาธารณะ หากต้องการทำสิ่งนี้คำสั่งจะเป็นดังนี้:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 

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

ส่วนที่คุณอ้างถึงซึ่งเป็นรูปแบบยาวของรหัสคีย์ย่อยของคีย์ (โดยทางเทคนิคแล้วรหัสคีย์เต็มคือลายนิ้วมือ) เป็นส่วนที่ระบุได้เท่านั้น อย่างไรก็ตามหากไม่มีการครอบครองกุญแจสาธารณะคุณไม่สามารถระบุรหัสหลักหรือตรวจสอบลายเซ็นได้ รายละเอียดของสิ่งนี้อยู่ในหัวข้อ 5.2 ของ RFC 4880 (เล็กน้อยในส่วนที่ 2.2 แต่ 5.2 เป็นสิ่งที่มีประโยชน์) หากฉันผิดพิสูจน์การยืนยันโดยไม่มีสำเนาของคีย์ (คำใบ้: คุณไม่สามารถทำได้ด้วยตัวอย่างของฉัน)
Ben

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

ใช่การระบุแบบเต็มเป็นไปไม่ได้จากรหัสคีย์เท่านั้น ฉันได้แก้ไขคำตอบเพื่อระบุอย่างชัดเจนว่านี่เป็นเพียงการเรียนรู้แบบฮิวริสติก ข้อสรุปของคุณคือสิ่งที่โปสเตอร์ขอเป็นไปไม่ได้ แต่อาจเป็นเพราะผู้โพสต์ใช้คำว่า "ยืนยัน" ซึ่งแรงเกินไป
harrymc

1
นั่นเป็นความจริง OP อาจไม่ได้ใช้คำศัพท์อย่างถูกต้องและฉันอาจทำให้พวกเขาไม่พอใจในหลาย ๆ ที่เช่นกัน (ฉันจามมากเมื่อคืนนี้) หากคำถามของเขาเป็นเพียงเกี่ยวกับการตรวจสอบซิกโดยไม่ต้องนำเข้าที่สำคัญแล้วเช่นในการแก้ไขของฉันแสดงให้เห็นว่าวิธีที่จะสามารถทำได้ แต่เพียงถ้าที่สำคัญที่อยู่ใน OpenPGP (pubkey.gpg) รูปแบบ ไม่ทำงานหากคีย์ที่ส่งออกอยู่ในรูปแบบ ASCII armored (pubkey.asc)
Ben

2

หากคุณตกลงกับการจัดส่งพวงกุญแจแทนที่จะเป็นไฟล์กุญแจสาธารณะคุณอาจต้องการใช้gpgvมากกว่าgpg:

gpgv --keyring key.ring somefile.txt

0

หากคำว่า "ยืนยัน" ของคุณในคำถามหมายถึง "ยืนยันจริง ๆ " แน่นอนว่าต้องนำเข้ากุญแจสาธารณะเพื่อยืนยันเอกสารที่เซ็นชื่ออย่างสมบูรณ์ อย่างไรก็ตามหากนี่หมายถึง "ระบุ" ฉันจะอธิบายฮิวริสติกด้านล่างซึ่งสามารถบอกได้ว่ากลุ่มของเอกสารทั้งหมดถูกเซ็นชื่อด้วยลายเซ็นเดียวกันหรือไม่

จากการทดสอบที่ดำเนินการโดย @Benเพื่อยืนยันความคิดเห็นของฉันมีความเป็นไปได้ที่คำสั่งต่อไปนี้สามารถใช้เพื่อระบุคีย์การเซ็นชื่อแบบ heuristically:

gpg --status-fd 1 --verify thefile.gpg

การทดสอบของเบ็นให้ผลลัพธ์ด้านล่าง สิ่งที่ควรทราบคือค่าของ ERRSIG และ NO_PUBKEY และค่าของ "RSA key ID" ซึ่งมีอยู่บางส่วนในนั้นทั้งสองดังต่อไปนี้:

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

7FF2D37135C7553Cหมายเหตุข้างต้นสตริง พบสตริงเดียวกันนี้ภายในคีย์ลายนิ้วมือที่รายงานเมื่อคีย์ถูกอิมพอร์ต:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

พบสตริงนี้เป็นส่วนล่างของลายนิ้วมือ (คีย์ย่อยด้านบน) ดังนั้นอาจใช้เพื่อระบุคีย์ "ลายนิ้วมือคีย์หลัก" ควรได้รับการยืนยันเช่นกันนอกเหนือจากคีย์ย่อย

สตริง "รหัส RSA คีย์" เหมือนกันในทั้งสองเอาต์พุตและยังพบว่าเป็นส่วนสุดท้ายของลายนิ้วมือดังนั้นจึงอาจเป็นไปได้ว่าตัวเองมีความเพียงพอในการระบุลายเซ็น หากเป็นเช่นนั้นการใช้เอาต์พุตเพียงอย่างเดียวgpg --verifyอาจเพียงพอที่จะระบุลายเซ็นได้ในวิธีที่ง่ายกว่า

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

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

เมื่อต้องการระบุอย่างชัดเจนอีกครั้ง: วิธีนี้ไม่สามารถระบุลายเซ็นได้ทั้งหมด มันเป็นวิธีเดียวในการจัดเรียงเอกสารที่เซ็นชื่อแบบ Heuristically


ลายเซ็นมีข้อมูลเพียงพอที่จะระบุคีย์ที่ใช้ในการสร้างและใช้ร่วมกับเซิร์ฟเวอร์คีย์ที่สามารถใช้เพื่อค้นหาคีย์หลัก (สมมติว่ามีการใช้คีย์ย่อยการเซ็นชื่อในตัวอย่างของฉัน) หากไม่มีสำเนาของกุญแจสาธารณะในรูปแบบ OpenPGP (ไม่ว่าจะเป็นในพวงกุญแจหรือในตัวอย่างสุดท้ายของฉัน) การตรวจสอบความถูกต้องของลายเซ็นเป็นไปไม่ได้เนื่องจากรหัสลายนิ้วมือ / รหัสคีย์ไม่เพียงพอสำหรับการคำนวณ
Ben

@Ben: ฉันทำซ้ำว่านี่เป็นเพียงการแก้ปัญหาซึ่งเป็นวิธีที่ดีที่สุดที่สามารถทำได้ในการตอบคำถามของผู้โพสต์ของ "ตรวจสอบว่าไฟล์ที่ลงนามโดยไฟล์คีย์สาธารณะโดยไม่ต้องนำเข้าและลงนามและเชื่อถือกุญแจ "
harrymc

มันจะทำให้คำถามชัดเจนขึ้นหรือไม่ถ้าฉันบอกว่าเราเชื่อถือคีย์ใด ๆ ในไฟล์. pub (สำหรับจุดประสงค์ในการตรวจสอบไฟล์ข้อมูลนี้โดยเฉพาะ) และเหตุผลที่เราเลือกเชื่อถือไฟล์. pub นี้อยู่นอกขอบเขตของ กิจกรรม GPG ใด ๆ
OJW

การวิเคราะห์รายชื่อคีย์ในไฟล์. pub และการเปรียบเทียบรหัสคีย์ RSA จะมีประโยชน์หรือไม่ ฉันไม่ได้ลองใช้ gpg ที่นี่ แต่อาจเป็น "gpg - no-default-keyring - keyring <pub-file> --list-keys"
harrymc
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.