Cara menggunakan baris perintah gpg untuk memeriksa kata sandi sudah benar

90

Saya mencoba mengotomatiskan pencadangan dengan duplicity, tetapi ketika saya menguji hasilnya, saya mengerti

gpg: dekripsi kunci publik gagal: frasa sandi buruk

Saya ingin memeriksa apakah frasa sandi yang saya gunakan sebenarnya adalah frasa sandi yang terkait dengan kunci rahasia gpg yang sesuai, tetapi saya tetap tidak dapat melihat di opsi baris perintah gpg untuk mengatakan "Jangan mengenkripsi atau mendekripsi apa pun. Cukup konfirmasi Saya menggunakan frasa sandi yang benar. "

Ini menunjukkan bahwa mungkin saya (lagi-lagi) salah paham dengan Gnu Privacy Guard. (Ia memiliki kecenderungan untuk mengejek saya sampai saya menangis.)

Apakah masuk akal meminta gpg untuk memverifikasi frasa sandi? Jika ya, bagaimana caranya?

Berpikir aneh
sumber

Jawaban:

115

Tidak ada metode bawaan untuk melakukan ini, tetapi cukup sederhana untuk membuat tes yang tidak mengubah apa pun dan memungkinkan Anda untuk hanya memeriksa frasa sandi Anda.

Anda tidak menentukannya, jadi saya akan menganggap Anda menggunakan GnuPG versi kurang dari v2 dan menggunakan Linux dengan Bash untuk penerjemah baris perintah Anda.

Saya akan memberikan perintah di sini dan di bawah ini saya akan menjelaskan apa yang dilakukan setiap bagian - (catatan: berikut ini untuk seri GnuPG versi 1, lihat di bawah untuk seri GnuPG v2)

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

Apa yang dilakukan adalah pertama, pipa beberapa teks untuk masuk ke GnuPG dengan echo "1234" |- karena kami tidak benar-benar ingin menandatangani apa pun, ini hanya tes, jadi kami akan menandatangani beberapa teks yang tidak berguna.

Selanjutnya, kami memberi tahu gpg untuk tidak menggunakan agen kunci dengan --no-use-agent; ini penting nanti karena, tergantung pada agen kunci Anda, ini mungkin tidak mengembalikan "0" pada keberhasilan, dan hanya itu yang ingin kami lakukan - verifikasi keberhasilan frasa sandi Anda.

Selanjutnya, kami memberi tahu gpg untuk meletakkan data yang ditandatangani langsung ke dalam /dev/nullfile, artinya kami membuangnya dan tidak menulis hasilnya ke terminal - CATATAN: jika Anda tidak menggunakan beberapa varian Linux / Unix, file ini mungkin tidak ada. Di windows Anda mungkin harus mengizinkannya untuk menulis data yang ditandatangani ke layar dengan hanya menghilangkan -o /dev/nullbagiannya.

Selanjutnya, kami menentukan kunci yang ingin kami uji dengan menggunakan --local-user 012345. Anda dapat menggunakan KeyID untuk kekhususan maksimum, atau menggunakan nama pengguna, mana saja yang paling sesuai dengan kebutuhan Anda.

Selanjutnya kita tentukan -as, yang mengaktifkan mode keluaran ascii, dan menyetel mode konteks untuk penandatanganan. Selanjutnya -hanya memberitahu GnuPG untuk mendapatkan data yang akan ditandatangani dari standar-in, yang merupakan bagian pertama dari perintah yang kami berikan echo "1234" |.

Dan terakhir, kita memiliki && echo "A message that indicates success"- "&&" artinya, jika perintah sebelumnya berhasil, cetak pesan ini. Ini hanya ditambahkan untuk kejelasan, karena keberhasilan perintah di atas akan ditunjukkan dengan tidak adanya keluaran sama sekali.

Saya harap itu cukup jelas bagi Anda untuk memahami apa yang sedang terjadi, dan bagaimana Anda dapat menggunakannya untuk melakukan pengujian yang ingin Anda lakukan. Jika ada bagian yang tidak jelas atau Anda tidak mengerti, saya akan dengan senang hati menjelaskan. Semoga berhasil!

[EDIT] - Jika Anda menggunakan GnuPG v2, perintah di atas perlu diubah sedikit, seperti:

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

Alasannya adalah, GnuPG v2 mengharapkan frasa sandi diambil melalui agen, jadi kita tidak dapat menonaktifkan penggunaan agen dengan --no-use-agentdan mendapatkan efek yang diinginkan; sebaliknya kita perlu memberi tahu GnuPG v2 bahwa kita ingin menjalankan proses "batch", dan mengambil frasa sandi dari STDIN (standar dalam) dengan menggunakan opsi --passphrase-fd 1.

kylehuff
sumber
11
Ini tidak bekerja dengan gpg2, karena selalu membutuhkan agen. Juga agen ncurses entah bagaimana menjadi bingung dengan input yang disalurkan. Jadi saya baru saja menggunakan gpg --local-user <KEYID> -as. Ini hanya memungkinkan agen meminta frasa sandi dan memberi tahu Anda apakah itu benar (Kemudian tidak melakukan apa-apa).
BubuIIC
1
Anda adalah BubullC yang benar, untuk sebagian besar; dengan sedikit modifikasi pada opsi yang diberikan, Anda dapat memperoleh hasil yang serupa dengan menggunakan gpg2. Saya mengubah jawaban saya untuk mendukung perbedaan antara gpg dan gpg2.
kylehuff
4
Coba ini untuk GnuPG 2.1:gpg -o /dev/null --local-user <KEYID> -as <(echo 1234) && echo "The correct passphrase was entered for this key"
starfry
6
Bagi saya di MacOS 10.12.6, tidak ada variasi yang meminta frasa sandi, dan mengembalikan pesan sukses apa pun.
Stan James
2
--passphrase-fd 1? membaca dari stdout? Ini bekerja untuk saya: gpg2 -aso - <(echo 1234); echo $?. Gunakan echo RELOADAGENT | gpg-connect-agentuntuk melupakan kata sandi.
x-yuri
20

Ini adalah baris perintah yang lebih pendek untuk memeriksa apakah frasa sandi OK:

gpg --export-secret-keys -a <KEYID> > /dev/null && echo OK
Tamu
sumber
Tidak, jika Anda memiliki gpg-agentaktif (yang kebanyakan orang miliki) dan Anda masuk dengan benar, ini tidak akan meminta frasa sandi.
foki
5

Bagi saya, cara sederhana untuk memeriksa frasa sandi adalah dengan menggunakan gpg --passwdsingkatan. Ia mencoba untuk mengubah frasa sandi dan langkahnya adalah untuk mengkonfirmasi frasa sandi lama, dan kemudian Anda dapat mengklik 'batal' pada prompt frasa sandi baru dan ini membuat frasa sandi tetap utuh.

gpg --passwd <your-user-id>
Lei Zhao
sumber
Ini memang cara paling mudah yang berhasil terlepas dari apakah Anda memiliki gpg-agentaktif atau tidak.
foki
2

Peringatan jangan gunakan gema gpg -o /dev/nullseperti yang disarankan oleh jawaban teratas di sini. Ini akan menyebabkan / dev / null memiliki izin yang tidak valid dan merusak /dev/nullfile. Anda dapat memverifikasi izin file / dev / null saat menjalankan perintah ini untuk membuktikannya.

Anda dapat menggunakan ini:

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

Saya juga membuat skrip bash untuk ini (Yang ini bekerja dengan Centos 8). Script ini akan meminta kata sandi, jika tidak valid akan terus meminta untuk memasukkan kata sandi yang valid. Juga jika Anda memasukkan KEY_ID yang salah atau tidak ada sebagai argumen, itu juga dapat memvalidasinya:

#!/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

Contoh keluaran jika tidak ada kata sandi yang di-cache di gpg-agent:

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

Contoh keluaran jika frasa sandi yang dimasukkan tidak valid (akan terus bertanya):

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

Contoh keluaran jika frasa sandi yang valid dimasukkan:

[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

Ketika frasa sandi yang valid di-cache, kali berikutnya Anda menjalankan skrip ini, Anda tidak akan diminta memasukkan frasa sandi. Jadi skrip ini memberikan solusi untuk pertanyaan Anda; "Cukup konfirmasikan bahwa saya menggunakan frasa sandi yang benar"

MaXi32
sumber