Як використовувати командний рядок gpg для перевірки правильної парольної фрази


88

Я намагаюся автоматизувати резервні копії за допомогою duplicity, але коли я перевіряю результат, я отримую

gpg: не вдалося розшифрувати відкритий ключ: неправильна парольна фраза

Я хочу перевірити, чи дійсно використовувана вами парольна фраза є парольною фразою, пов'язаною з відповідним секретним ключем gpg, але я все одно не бачу в параметрах командного рядка gpg, щоб сказати "Нічого не шифрувати або дешифрувати. Просто підтвердьте Я використовую правильну парольну фразу. "

Це свідчить про те, що, можливо, я (ще раз) не розумію Gnu Privacy Guard. (У ньому є прихильність до того, щоб знущатись до мене, поки я не заплачу.)

Чи є сенс запитувати gpg для перевірки парольної фрази? Якщо так, то як?

Відповіді:


114

Для цього не існує вбудованого методу, але досить просто створити тест, який нічого не змінює і дозволяє просто перевірити свою парольну фразу.

Ви не вказали, тому я припускаю, що ви використовуєте версію GnuPG, меншу ніж v2, і використовуєте Linux з 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файл, тобто ми відкидаємо їх, а не записуємо результат у термінал - ПРИМІТКА: якщо ви не використовуєте якийсь варіант Linux / Unix, цього файлу може не бути. У вікнах вам може знадобитися просто дозволити йому писати підписані дані на екран, просто опустивши -o /dev/nullчастину.

Далі ми вказуємо ключ, за допомогою якого ми хочемо провести тест --local-user 012345. Ви можете використовувати KeyID для максимальної конкретності або використовувати ім’я користувача, залежно від того, що найбільше відповідає вашим потребам.

Далі ми вказуємо -as, що включає режим виводу ascii, і встановлює контекстний режим для підписання. -Потім просто говорить GnuPG , щоб отримати дані , які повинні бути підписані від стандартного в, який є першою частиною команди ми дали echo "1234" |.

І нарешті, ми маємо && echo "A message that indicates success"- "&&" означає, що якщо попередня команда була успішною, надрукуйте це повідомлення. Це просто додано для ясності, оскільки про успіх наведеної вище команди в іншому випадку не свідчило б взагалі.

Я сподіваюся, це достатньо ясно для вас, щоб ви зрозуміли, що відбувається, і як ви можете використовувати це для тестування, яке ви хочете зробити. Якщо якась частина незрозуміла або ви її не розумієте, я буду радий пояснити. Удачі!

[EDIT] - Якщо ви використовуєте 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. Це просто дозволяє агенту запитати парольну фразу та повідомляє, чи правильно вона була (Тоді нічого не робить).
BubuIIC

1
Ви маєте рацію BubullC, здебільшого; з невеликими змінами до переданих параметрів ви можете отримати подібний результат за допомогою gpg2. Я змінив свою відповідь, щоб підтримати відмінності між gpg та gpg2.
kylehuff

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 жоден із варіантів не вимагає введення парольної фрази та повернення повідомлення про успіх незалежно.
Стен Джеймс

1
--passphrase-fd 1? читати зі stdout? Це працює для мене: gpg2 -aso - <(echo 1234); echo $?. Використовуйте echo RELOADAGENT | gpg-connect-agentдля забуття парольних фраз.
x-yuri

20

Це коротший командний рядок, щоб перевірити, чи відповідає парольна фраза:

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

3

Для мене спрощений спосіб перевірки парольної фрази - це використання gpg --passwdскороченого тексту. Він намагається змінити парольну фразу, і крок полягає у підтвердженні старої парольної фрази, а потім ви можете натиснути кнопку "скасувати" у новому запиті парольної фрази, і це збереже пароль.

gpg --passwd <your-user-id>

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

Я також створив для цього скрипт bash (цей працює з Centos 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-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:

Зразок виводу, якщо введено неправильну парольну фразу (вона буде продовжувати запитувати):

[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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.