Parolanın doğru olup olmadığını kontrol etmek için gpg komut satırı nasıl kullanılır


90

İle yedeklemeleri otomatik hale getirmeye çalışıyorum duplicity, ancak sonucu test ettiğimde

gpg: genel anahtarın şifresini çözme başarısız: hatalı parola

Kullandığım parolanın aslında karşılık gelen gpg gizli anahtarıyla ilişkili parola olup olmadığını kontrol etmek istiyorum, ancak yine de gpg komut satırı seçeneklerinde "Hiçbir şeyi şifreleme veya şifresini çözme. Sadece onaylayın. Doğru parolayı kullanıyorum. "

Bu, belki de (yine) Gnu Privacy Guard'ı yanlış anladığımı gösteriyor. (Ağlayana kadar benimle alay etme eğilimindedir.)

Gpg'den bir parolayı doğrulamasını istemek mantıklı mı? Öyleyse nasıl?

Yanıtlar:


115

Bunu yapmak için yerleşik bir yöntem yoktur, ancak hiçbir şeyi değiştirmeyen ve yalnızca parolanızı kontrol etmenize izin veren bir test oluşturmak yeterince basittir.

Belirtmediniz, bu yüzden GnuPG sürümünü v2'den daha az kullandığınızı ve komut satırı yorumlayıcınız için Bash ile Linux'ta olduğunuzu varsayacağım.

Burada komutu vereceğim ve aşağıda her bir parçanın ne yaptığını açıklayacağım - (not: aşağıdaki GnuPG serisi sürüm 1 için, aşağıya GnuPG serisi v2 için bakın)

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

Bunun yaptığı ilk önce, GnuPG'ye giriş yapmak için bir metin göndermektir echo "1234" |- çünkü gerçekten hiçbir şeyi imzalamak istemiyoruz, bu sadece bir test, bu yüzden bazı gereksiz metinleri imzalayacağız.

Daha sonra, gpg'ye anahtar aracıyı kullanmamasını söyleyeceğiz --no-use-agent; bu daha sonra önemlidir, çünkü anahtar temsilcinize bağlı olarak, başarı durumunda "0" döndürmeyebilir ve tüm yapmak istediğimiz budur - parolanızın başarısını doğrulayın.

Daha sonra, gpg'ye imzalanmış verileri doğrudan /dev/nulldosyaya koymasını söyleriz , yani onu atarız ve sonucu terminale yazmayız - NOT: Linux / Unix'in bazı varyantlarını kullanmıyorsanız, bu dosya mevcut olmayabilir. Windows'ta, sadece -o /dev/nullparçayı atlayarak imzalanmış verileri ekrana yazmasına izin vermeniz gerekebilir .

Daha sonra testimizi yapmak istediğimiz anahtarı kullanarak belirtiyoruz --local-user 012345. KeyID'yi maksimum özgüllük için kullanabilir veya ihtiyaçlarınıza en uygun olanı bir kullanıcı adı kullanabilirsiniz.

Ardından -as, ascii çıktı modunu etkinleştiren ve imzalama için bağlam modunu ayarlayan belirtiyoruz. -Sonradan sadece veri standart içinde, biz verdik komutunun ilk bölümüdür hangi imzalanacak almak için GnuPG'yi söyler echo "1234" |.

Ve son olarak, && echo "A message that indicates success"- "&&", önceki komut başarılıysa, bu mesajı yazdır anlamına gelir. Bu sadece açıklık sağlamak için eklenmiştir, çünkü aksi takdirde yukarıdaki komutun başarısı hiçbir çıktı ile gösterilmeyecektir.

Umarım bu, neler olup bittiğini anlamanız ve yapmak istediğiniz testi yaparken bunu nasıl kullanabileceğinizi anlamanız için yeterince açıktır. Herhangi bir kısım net değilse veya anlamıyorsanız, açıklığa kavuşturmaktan memnuniyet duyarım. İyi şanslar!

[DÜZENLE] - GnuPG v2 kullanıyorsanız, yukarıdaki komutun aşağıdaki gibi biraz değiştirilmesi gerekecektir:

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

Bunun nedeni, GnuPG v2'nin parolanın bir aracı aracılığıyla alınmasını beklemesidir, bu nedenle aracının kullanımını devre dışı bırakıp --no-use-agentistenen etkiyi elde edemeyiz ; bunun yerine GnuPG v2'ye bir "toplu işlem" yürütmek istediğimizi ve seçeneği kullanarak STDIN'den (standart giriş) parolayı almak istediğimizi söylememiz gerekir --passphrase-fd 1.


11
Bu, her zaman bir aracı gerektirdiği için gpg2 ile çalışmaz. Ayrıca ncurses ajanı borulu girdiyle bir şekilde karışır. Ben de kullandım gpg --local-user <KEYID> -as. Bu sadece aracının parolayı istemesine ve size doğru olup olmadığını söylemesine izin verir (Sonra hiçbir şey yapmaz).
BubuIIC

1
Çoğunlukla doğru BubullC'siniz; aktarılan seçeneklerde küçük değişikliklerle, gpg2 kullanarak benzer bir sonuç elde edebilirsiniz. Cevabımı gpg ve gpg2 arasındaki farkları desteklemek için değiştirdim.
kylehuff

4
Bunu GnuPG 2.1 için deneyin:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry

6
Benim için MacOS 10.12.6'da, varyasyonların hiçbiri parola istemiyor ve ne olursa olsun bir başarı mesajı döndürmüyor.
Stan James

2
--passphrase-fd 1? standart çıktıdan okundu mu? Bu benim için çalışıyor: gpg2 -aso - <(echo 1234); echo $?. echo RELOADAGENT | gpg-connect-agentParolaları unutmak için kullanın .
x-yuri

20

Bu, parolanın uygun olup olmadığını kontrol etmek için daha kısa bir komut satırıdır:

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

Hayır, eğer gpg-agentaktif (çoğu insanın sahip olduğu) varsa ve doğru bir şekilde oturum açtıysanız, bu parola istemeyecektir.
foki

5

Benim için parolayı kontrol etmenin basit yolu, gpg --passwdsteno kullanmaktır . Parolayı değiştirmeye çalışır ve adım, eski parolayı onaylamaktır ve ardından yeni parola isteminde "iptal" e tıklayabilirsiniz ve bu, parolayı olduğu gibi tutar.

gpg --passwd <your-user-id>

Bu gerçekten de gpg-agentaktif olup olmadığınıza bakılmaksızın çalışan en basit yöntemdir .
foki

2

Uyarı gpg -o /dev/nullburada en iyi yanıtta önerildiği gibi yankıyı kullanmayın . Bu, / dev / null'un geçersiz izne sahip olmasına ve/dev/null dosyanın . Bunu kanıtlamak için bu komutu çalıştırırken / dev / null dosyasının iznini doğrulayabilirsiniz.

Bunu kullanabilirsiniz:

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

Bunun için bash betiği de oluşturdum (Bu Centos 8 ile çalışıyor). Bu betik parola soracaktır, eğer geçersizse, geçerli parola girilmesini istemeye devam edecektir. Ayrıca, bağımsız değişken olarak yanlış veya mevcut olmayan KEY_ID girerseniz, bunu da doğrulayabilir:

#!/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-agent'ta parola önbelleğe alınmadıysa örnek çıktı:

[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:

Geçersiz parola girilirse örnek çıktı (sormaya devam eder):

[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:

Geçerli parola girilirse örnek çıktı:

[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

Geçerli parola önbelleğe alındığında, bu komut dosyasını bir sonraki çalıştırışınızda, parola girmenizi istemeyecektir. Bu senaryo, sorunuzun çözümünü veriyor; "Doğru parolayı kullandığımı onaylayın"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.