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 18

यहां कुछ संदर्भ: हमारे पास एक प्रणाली है जो चीजों पर हस्ताक्षर करती है। हम उन लोगों को इसकी सार्वजनिक कुंजी देते हैं, जो इस प्रणाली से संदेश प्राप्त कर सकते हैं, ताकि वे जांच सकें कि संदेशों के साथ छेड़छाड़ नहीं की गई थी। हालाँकि हम प्राप्तकर्ताओं को " इस कुंजी द्वारा हस्ताक्षरित किसी भी चीज़ पर भरोसा" नहीं बताना चाहते हैं क्योंकि तब इसका उपयोग अन्य प्रणालियों के संदेशों को प्रमाणित करने के लिए किया जा सकता है (जैसे उनके दोस्तों से ईमेल)।
OJW

इसलिए हम किसी को एक कमांड / बैच फ़ाइल देना चाहते हैं जो यह चेक करती है "क्या 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- पैकेट) के लिए उपलब्ध डेटा से मेल खाता है:

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$ 

जैसा कि आप देख सकते हैं कि यह हैश एल्गोरिथ्म प्रदान करता है, कुंजी के प्रकार का विवरण (मेरी हस्ताक्षरित कुंजी 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]$ 

सत्यापन चरण के लिए सार्वजनिक कुंजी की आवश्यकता होती है क्योंकि इसका उपयोग हस्ताक्षरकर्ता द्वारा अपनी निजी कुंजी के साथ उत्पन्न डेटा से मिलान करने के लिए किया जाता है। इसे साधारण शब्दों में, एन्क्रिप्शन के पूरक के रूप में सोचा जा सकता है, जहां सार्वजनिक कुंजी में एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट करने के लिए निजी कुंजी की आवश्यकता होती है।

नोट: मैंने यूआईडी को इस उदाहरण में थोड़ा घुमाया है, लेकिन हर कोई जो उस कुंजी को प्राप्त करता है, वह देखेगा कि वे वास्तव में क्या हैं। अन्यथा आउटपुट एक सीधी कॉपी और पेस्ट है।

संपादित करें: यदि आप गैर-एएससीआईआई बख़्तरबंद (यानी। टीसी फ़ाइल के बजाय .gpg फ़ाइल) में है, तो आप सार्वजनिक कुंजी फ़ाइल को कीरिंग की तरह सीधे कॉल कर सकते हैं। फिर भी, आपको अभी भी सार्वजनिक कुंजी की आवश्यकता है। ऐसा करने के लिए कमांड इस तरह है:

[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

भाग आप जो को देखें उपकुंजी के प्रमुख आईडी लंबे फार्म (तकनीकी रूप से पूर्ण कुंजी आईडी है है फिंगरप्रिंट) केवल पहचान योग्य हिस्सा है। सार्वजनिक कुंजी के कब्जे के बिना, हालांकि, आप मास्टर कुंजी को पहचान नहीं सकते हैं या हस्ताक्षर को सत्यापित नहीं कर सकते हैं । इसका विवरण RFC 4880 के खंड 5.2 (खंड 2.2 में थोड़ा सा है, लेकिन 5.2 जहां उपयोगी सामान है) में हैं। अगर मैं कुंजी की एक प्रति के बिना सत्यापन को गलत साबित कर रहा हूं (संकेत: आप इसे मेरे उदाहरणों के साथ नहीं कर सकते हैं)।
बेन

इसके अलावा, आपके संबंध में --verify के बारे में, यह केवल तभी काम करता है जब कुंजी उपलब्ध हो, अन्यथा मेरे उत्तर में पहले उदाहरण पर जाएं जहां हस्ताक्षर की कुंजी आईडी और समय सत्यापित किया गया है, लेकिन कुंजी नहीं मिली है।
बेन

हां, पूर्ण पहचान केवल कुंजी आईडी से संभव नहीं है। मैंने अपने उत्तर को स्पष्ट रूप से संशोधित करने के लिए कहा है कि यह केवल एक अनुमान है। आपका निष्कर्ष यह है कि पोस्टर जो पूछ रहा है वह असंभव है, लेकिन यह शायद इसलिए है क्योंकि पोस्टर ने "सत्यापित" शब्द का उपयोग किया है जो बहुत मजबूत है।
harrymc

1
यह सच है, ओपी शायद शर्तों का ठीक से उपयोग नहीं कर रहा है और हो सकता है कि मैंने उन्हें एक-दो जगहों पर ठग लिया हो (मैं कल रात बहुत छींक रहा था )। यदि उसका सवाल सिर्फ कुंजी को आयात किए बिना एक सिग को मान्य करने के बारे में था, तो मेरे संपादन में उदाहरण दिखाता है कि यह कैसे किया जा सकता है, लेकिन केवल अगर वह कुंजी OpenPGP (pubkey.gpg) प्रारूप में है। यदि ASCII बख़्तरबंद (pubkey.asc) प्रारूप में निर्यात की गई कुंजी है तो यह काम नहीं करता है।
बेन

2

यदि आप सार्वजनिक कुंजी फ़ाइल के बजाय कीरिंग के साथ ठीक हैं, तो आप संभवतः gpgvइसके बजाय उपयोग करना चाहते हैं gpg:

gpgv --keyring key.ring somefile.txt

0

यदि प्रश्न में आपका शब्द "सत्यापित" का अर्थ "बिल्कुल सत्यापित" है, तो निश्चित रूप से एक हस्ताक्षरित दस्तावेज़ को पूरी तरह से सत्यापित करने के लिए एक सार्वजनिक कुंजी आयात की जानी चाहिए। हालांकि, अगर इसका मतलब "पहचान" है, तो मैं एक अनुमान के नीचे वर्णन करता हूं जो यह बता सकता है कि क्या दस्तावेजों के एक समूह में सभी एक ही हस्ताक्षर किए गए थे।

मेरी टिप्पणी को सत्यापित करने के लिए @Ben द्वारा किए गए परीक्षणों के अनुसार , इस बात की संभावना है कि निम्न आदेश का उपयोग हस्ताक्षर की कुंजी को इंगित करने के लिए किया जा सकता है:

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

बेन के परीक्षण ने नीचे परिणाम दिया। ध्यान दें, ERRSIG और NO_PUBKEY के मूल्य हैं, और "RSA कुंजी 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

इस स्ट्रिंग को फिंगरप्रिंट (निचला उपर) के निचले हिस्से के रूप में पाया जाता है, इसलिए संभवतः कुंजी की पहचान करने के लिए इसका उपयोग किया जा सकता है। "प्राथमिक कुंजी फिंगरप्रिंट" को संभवत: उपकुंजी के अतिरिक्त, सत्यापित किया जाना चाहिए।

"आरएसए कुंजी आईडी" स्ट्रिंग दोनों आउटपुट में समान है और इसे फिंगरप्रिंट के अंतिम भाग के रूप में भी पाया जाता है, इसलिए यह संभव है कि यह हस्ताक्षर की पहचान करने के लिए अपने आप में पर्याप्त हो। यदि ऐसा है, तो केवल 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

जीपीजी का मेरा ज्ञान इस पद्धति को पूरी तरह से मान्य करने के लिए पर्याप्त नहीं है, इसलिए आपको इसे अधिक उदाहरण फ़ाइलों पर आज़माना चाहिए। यदि यह काम करता है, तो आप उनके हस्ताक्षर के अनुसार फ़ाइलों को सॉर्ट कर सकते हैं, लेकिन साइन की पहचान खोजने के लिए कुंजी को आयात करने की आवश्यकता होगी।

फिर से स्पष्ट रूप से बताने के लिए: यह विधि हस्ताक्षर की पूरी तरह से पहचान नहीं कर सकती है। यह केवल दस्तावेजों पर हस्ताक्षर करने का एक तरीका है।


एक हस्ताक्षर में इसे बनाने के लिए उपयोग की जाने वाली कुंजी की पहचान करने के लिए पर्याप्त डेटा होता है और मुख्य सर्वर के साथ संयोजन के रूप में इसका उपयोग मास्टर कुंजी का पता लगाने के लिए किया जा सकता है (एक हस्ताक्षर उपकुंजी का उपयोग मेरे उदाहरण के रूप में किया गया था)। OpenPGP प्रारूप में सार्वजनिक कुंजी की एक प्रतिलिपि के बिना (या तो कीरिंग में या मेरे अंतिम उदाहरण के रूप में), हस्ताक्षर की पुष्टि संभव नहीं है क्योंकि गणना करने के लिए फिंगरप्रिंट / कुंजी आईडी पर्याप्त डेटा नहीं है।
बेन

@ बान: मैं दोहराता हूं कि यह केवल एक विधर्मी है, जो सबसे अच्छा है जो पोस्टर के सवाल के जवाब में किया जा सकता है "यह सत्यापित करें कि क्या किसी विशेष सार्वजनिक कुंजी फ़ाइल द्वारा आयात और हस्ताक्षर किए बिना और उस कुंजी पर भरोसा किए बिना एक फ़ाइल पर हस्ताक्षर किए गए थे" "।
harrymc

क्या यह सवाल किसी भी स्पष्ट कर देगा यदि मैंने कहा कि हम .pub फ़ाइल (इस विशिष्ट डेटा फ़ाइल की जाँच के उद्देश्यों के लिए) में किसी भी कुंजी पर भरोसा करते हैं, और यही कारण है कि हम इस .pub फ़ाइल पर भरोसा करने के लिए चुनते हैं। किसी भी GPG गतिविधि?
OJW

क्या .pub फ़ाइल में कुंजियाँ सूचीबद्ध करने और उनकी RSA कुंजी ID की तुलना करने का अनुमान उपयोगी होगा? मेरे पास कोशिश करने के लिए यहाँ gpg नहीं है, लेकिन शायद "gpg -no-default-keyring --keyring <pub-file> --list-keys" जैसा कुछ है।
harrymc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.