पासफ़्रेज़ की जाँच करने के लिए gpg कमांड-लाइन का उपयोग कैसे करें सही है


90

मैं बैकअप को स्वचालित करने की कोशिश कर रहा हूं duplicity, लेकिन जब मैं परिणाम का परीक्षण करता हूं, तो मुझे मिलता है

gpg: सार्वजनिक कुंजी डिक्रिप्शन विफल: खराब पासफ़्रेज़

मैं जांचना चाहता हूं कि क्या मैं जो पासफ़्रेज़ का उपयोग कर रहा हूं, वह वास्तव में संबंधित gpg गुप्त-कुंजी से जुड़ा हुआ पासफ़्रेज़ है, लेकिन मैं वैसे भी gpg कमांड-लाइन विकल्पों में यह नहीं कह सकता कि "कुछ भी एन्क्रिप्ट न करें या डिक्रिप्ट न करें।" मैं सही पासफ़्रेज़ का उपयोग कर रहा हूं। ”

इससे पता चलता है कि शायद मैं (अभी तक फिर से) गुन्नू प्राइवेसी गार्ड को गलत समझ रहा हूं। (जब तक मैं रोता हूं, तब तक मुझे ताना मारने का पूर्वाभास है।)

क्या यह पासफ़्रेज़ को सत्यापित करने के लिए gpg पूछने के लिए समझ में आता है? यदि हां, तो कैसे?

जवाबों:


115

ऐसा करने के लिए कोई अंतर्निहित पद्धति नहीं है, लेकिन यह एक परीक्षण बनाने के लिए काफी सरल है जो कुछ भी संशोधित नहीं करता है और आपको बस अपने पासफ़्रेज़ की जांच करने की अनुमति देता है।

आपने निर्दिष्ट नहीं किया, इसलिए मैं मान लूंगा कि आप V2 से कम GnuPG संस्करण का उपयोग कर रहे हैं और अपने कमांड लाइन दुभाषिया के लिए Bash के साथ लिनक्स पर हैं।

मैं यहां कमांड दे रहा हूं और नीचे मैं बताऊंगा कि प्रत्येक भाग क्या करता है - (नोट: निम्नलिखित GnuPG श्रृंखला संस्करण 1 के लिए है, GnuPG श्रृंखला v2 के लिए नीचे देखें)

echo "1234" | gpg --no-use-agent -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

जो सबसे पहले होता है, वह कुछ टेक्स्ट को GnuPG के साथ साइन इन करने के लिए पाइप करता है echo "1234" |- क्योंकि हम वास्तव में कुछ भी साइन नहीं करना चाहते हैं, यह सिर्फ एक परीक्षा है, इसलिए हम कुछ बेकार टेक्स्ट पर हस्ताक्षर करेंगे।

अगला, हम gpg से कहते हैं कि प्रमुख एजेंट का उपयोग न करें --no-use-agent; यह बाद में महत्वपूर्ण है क्योंकि, आपके प्रमुख एजेंट के आधार पर, यह सफलता पर "0" वापस नहीं कर सकता है, और यही सब हम करना चाहते हैं - अपने पासफ़्रेज़ की सफलता को सत्यापित करें।

अगला, हम gpg को सीधे हस्ताक्षरित डेटा को /dev/nullफ़ाइल में डालने के लिए कहते हैं, जिसका अर्थ है कि हम इसे छोड़ देते हैं और टर्मिनल पर परिणाम नहीं लिखते हैं - नोट: यदि आप लिनक्स / यूनिक्स के कुछ संस्करण का उपयोग नहीं कर रहे हैं, तो यह फ़ाइल मौजूद नहीं हो सकती है। खिड़कियों पर आपको केवल -o /dev/nullभाग को छोड़ कर स्क्रीन पर हस्ताक्षर किए गए डेटा को लिखने की अनुमति देनी पड़ सकती है ।

अगला, हम उस कुंजी को निर्दिष्ट करते हैं जिसका उपयोग करके हम अपना परीक्षण करना चाहते हैं --local-user 012345। आप अधिकतम विशिष्टता के लिए KeyID का उपयोग कर सकते हैं, या किसी उपयोगकर्ता नाम का उपयोग कर सकते हैं, जो भी आपकी आवश्यकताओं का सबसे अच्छा सूट करता है।

आगे हम निर्दिष्ट करते हैं -as, जो एएससीआई आउटपुट मोड को सक्षम करता है, और हस्ताक्षर करने के लिए संदर्भ मोड सेट करता है। -बाद में बस GnuPG बताता डेटा मानक में है, जो आदेश हम दे दी है के पहले भाग होने पर हस्ताक्षर किए जाने के लिए प्राप्त करने echo "1234" |

और अंतिम, हमारे पास && echo "A message that indicates success"- "&&" का अर्थ है, यदि पिछली कमांड सफल रही, तो इस संदेश को प्रिंट करें। यह सिर्फ स्पष्टता के लिए जोड़ा गया है, क्योंकि ऊपर दिए गए आदेश की सफलता को अन्यथा किसी भी आउटपुट द्वारा इंगित नहीं किया जाएगा।

मुझे आशा है कि आपके लिए यह समझने के लिए पर्याप्त स्पष्ट है कि क्या चल रहा है, और आप इसका उपयोग कैसे कर सकते हैं जो आप करना चाहते हैं। यदि कोई हिस्सा अस्पष्ट है या आप नहीं समझते हैं, तो मुझे स्पष्ट करने में खुशी होगी। सौभाग्य!

[संपादित करें] - यदि आप GnuPG v2 का उपयोग कर रहे हैं, तो उपरोक्त कमांड को थोड़ा संशोधित करना होगा, जैसे:

echo "1234" | gpg2 --batch --passphrase-fd 1 -o /dev/null --local-user <KEYID> -as - && echo "The correct passphrase was entered for this key"

इसका कारण, GnuPG v2 एक एजेंट के माध्यम से पासफ़्रेज़ को पुनः प्राप्त करने की उम्मीद करता है, इसलिए हम एजेंट के उपयोग को अक्षम नहीं कर सकते --no-use-agentहैं और वांछित प्रभाव डाल सकते हैं; इसके बजाय हमें GnuPG v2 को बताने की आवश्यकता है कि हम एक "बैच" प्रक्रिया चलाना चाहते हैं, और विकल्प का उपयोग करके STDIN (मानक) से पासफ़्रेज़ को पुनः प्राप्त करते हैं --passphrase-fd 1


11
यह gpg2 के साथ काम नहीं करता है, क्योंकि इसे हमेशा एक एजेंट की आवश्यकता होती है। इसके अलावा ncurses एजेंट किसी तरह से पाइप किए गए इनपुट से भ्रमित हो जाता है। इसलिए मैंने अभी उपयोग किया है gpg --local-user <KEYID> -as। यह बस एजेंट को पासफ़्रेज़ के लिए पूछता है और आपको बताता है कि क्या यह सही था (फिर कुछ नहीं करता है)।
बुबुइक

1
आप सबसे अधिक भाग के लिए सही बबलकुल हैं; दिए गए विकल्पों में मामूली संशोधन के साथ आप gpg2 का उपयोग करके एक समान परिणाम प्राप्त कर सकते हैं। मैंने अपने उत्तर को gpg और gpg2 के बीच अंतर का समर्थन करने के लिए संशोधित किया।
काइलहफ

4
GnuPG 2.1 के लिए यह प्रयास करें:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry

6
मेरे लिए MacOS 10.12.6 पर, कोई भी विविधता पासफ़्रेज़ के लिए संकेत नहीं देती है, और सफलता की परवाह किए बिना संदेश लौटाती है।
स्टेन जेम्स

2
--passphrase-fd 1? स्टडआउट से पढ़ें? यह मेरे लिए काम करता है gpg2 -aso - <(echo 1234); echo $?:। echo RELOADAGENT | gpg-connect-agentपासफ़्रेज़ को भूलने के लिए उपयोग करें ।
x-yuri

20

पासफ़्रेज़ ठीक है या नहीं यह जाँचने के लिए एक छोटी कमांड लाइन है:

gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK

नहीं, यदि आपके पास एक gpg-agentसक्रिय है (जो अधिकांश लोगों के पास है) और आप ठीक से लॉग इन हैं, तो यह पासफ़्रेज़ के लिए नहीं पूछेगा।
foki

6

मेरे लिए पासफ़्रेज़ की जाँच करने का सरल तरीका gpg --passwdशॉर्टहैंड का उपयोग करना है । यह पासफ़्रेज़ को बदलने का प्रयास करता है और पुराने पासफ़्रेज़ की पुष्टि करने के लिए चरण है, और फिर आप नए पासफ़्रेज़ प्रॉम्प्ट पर 'रद्द' पर क्लिक कर सकते हैं और इससे पासफ़्रेज़ बरकरार रहता है।

gpg --passwd <your-user-id>

यह वास्तव में सबसे सरल तरीका है जो इस बात पर ध्यान दिए बिना काम करता है कि आपके पास gpg-agentसक्रिय है या नहीं।
foki

2

चेतावनी gpg -o /dev/nullयहाँ उत्तर के रूप में सुझाए गए प्रतिध्वनि का उपयोग नहीं करती है। यह अमान्य अनुमति और /dev/nullफ़ाइल को दूषित करने के कारण / dev / null का कारण होगा । इसे साबित करने के लिए आप इस कमांड को चलाते समय / dev / null फाइल की अनुमति को सत्यापित कर सकते हैं।

आप इसका उपयोग कर सकते हैं:

echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null

मैंने इसके लिए बैश स्क्रिप्ट भी बनाई (यह एक सेंटोस 8 के साथ काम कर रहा है)। यह स्क्रिप्ट पासफ़्रेज़ के लिए पूछेगा, यदि यह अमान्य है, तो यह इनपुट मान्य पासफ़्रेज़ के लिए पूछेगा। यदि आप गलत या गैर-मौजूदा KEY_ID को एक तर्क के रूप में इनपुट करते हैं तो यह मान्य हो सकता है:

#!/bin/bash
# usage ./gpgcron KEYID   | ./gpgcron 2B705B8B6FA943B1
script_path=$(dirname $(realpath -s $0))
script_name=$(basename -- "$0")
GPG_CACHE_BIN="/usr/libexec/gpg-preset-passphrase"
KEY_ID=$1
KEY_GRIP=$(gpg --with-keygrip --list-secret-keys $KEY_ID | grep -Pom1 '^ *Keygrip += +\K.*')
RETVAL=$?
if [[ $RETVAL -ne 0 || -z $KEY_ID ]]; then
    echo "Please provide correct KEY_ID. Example ./$script_name KEY_ID"
    exit 1
fi

export GPG_TTY=$(tty)

function set_gpg_cachepass {
    read -s -p "[$script_name | input]: Enter passphrase to cache into gpg-agent: " PASSPHRASE; echo
    $GPG_CACHE_BIN -c $KEY_GRIP <<< $PASSPHRASE
    RETVAL=$?
    echo "[$script_name | info ]: gpg-preset-passphrase return code: [$RETVAL]"
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: A passphrase has been set and cached in gpg-agent"
        echo "[$script_name | info ]: Paraphrase set return code: [$RETVAL]"
        gpg_validatepass
    else
        echo "[$script_name | info ]: Unsuccessful error occured: [$RETVAL]"
        set_gpg_cachepass
    fi
}

function gpg_validatepass {
    echo "[$script_name | info ]: Validating passphrase cached in gpg-agent ..."
    echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
        echo "[$script_name | info ]: OK, valid passphrase has been cached in gpg-agent"
    else
        echo "[$script_name | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent"
        set_gpg_cachepass
    fi
}

RES=$(echo "KEYINFO --no-ask $KEY_GRIP Err Pmt Des" | gpg-connect-agent | awk '{ print $7 }')
if [ "$RES" == "1" ]; then
    echo "[$script_name | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [$KEY_ID]"
    gpg_validatepass
else
    echo "[$script_name | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [$KEY_ID]"
    set_gpg_cachepass
fi

नमूना आउटपुट अगर कोई पासवर्ड gpg- एजेंट में कैश्ड नहीं है:

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: Warning, no passphrase is cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

यदि अमान्य पासफ़्रेज़ दर्ज किया गया है तो नमूना आउटपुट (यह पूछते रहेंगे):

[root@earth gpg]# ./gpgcron 2B705B8B6FA943B2
[gpgcron | info ]: OK, passphrase is already cached in gpg agent for KEY_ID of [2B705B8B6FA943B2]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
gpg: signing failed: Bad passphrase
gpg: signing failed: Bad passphrase
[gpgcron | info ]: Warning, invalid passphrase or no passphrase is cached in gpg-agent
[gpgcron | input]: Enter passphrase to cache into gpg-agent:

यदि वैध पासफ़्रेज़ दर्ज किया गया है तो नमूना आउटपुट:

[gpgcron | input]: Enter passphrase to cache into gpg-agent:
[gpgcron | info ]: gpg-preset-passphrase return code: [0]
[gpgcron | info ]: A passphrase has been set and cached in gpg-agent
[gpgcron | info ]: Paraphrase set return code: [0]
[gpgcron | info ]: Validating passphrase cached in gpg-agent ...
[gpgcron | info ]: OK, valid passphrase has been cached in gpg-agent

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.