如何使用gpg命令行来检查密码是正确的

Odd*_*ing 79 gnupg

我正在尝试使用自动备份duplicity,但是当我测试结果时,我得到了

gpg:公钥解密失败:密码错误

我想检查我使用的密码是否实际上是与相应的gpg密钥相关联的密码,但我无法在gpg命令行选项中看到说"不加密或解密任何东西.只需确认我正在使用正确的密码."

这表明我可能(又一次)误解了Gnu Privacy Guard.(在我哭之前,它倾向于嘲弄我.)

请求gpg验证密码是否有意义?如果是这样,怎么样?

kyl*_*uff 110

没有内置的方法可以做到这一点,但它很简单,创建一个不修改任何东西的测试,并允许您只检查您的密码.

你没有指定,所以我假设你使用的是低于v2的GnuPG版本,并且在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变体,则此文件可能不存在.在Windows上,您可能只需要通过省略-o /dev/null零件就可以将签名数据写入屏幕.

接下来,我们通过使用指定我们想要进行测试的密钥--local-user 012345.您可以使用KeyID获得最大的特异性,或使用用户名,以满足您的需求为准.

接下来我们指定-as,它启用ascii输出模式,并设置签名的上下文模式.在-后来才告诉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.

  • 这不适用于gpg2,因为它总是需要一个代理.此外,ncurses代理以某种方式被管道输入混淆.所以我只使用了`gpg --local-user <KEYID> -as`.这只是让代理人要求密码并告诉你它是否正确(然后什么都不做). (11认同)
  • 对于我在MacOS 10.12.6上,没有任何变体提示密码,并且无论如何都返回成功消息. (5认同)
  • 尝试使用GnuPG 2.1:`gpg -o/dev/null --local-user <KEYID> -as <(echo 1234)&& echo"为此键输入了正确的密码" (3认同)
  • `--passphrase-fd 1`?从标准输出读取?这对我有用:`gpg2 -aso - &lt;(echo 1234); 回声 $?`。使用`echo RELOADAGENT | gpg-connect-agent` 忘记密码。 (2认同)

Lei*_*hao 18

对我来说,检查密码的简单方法是使用gpg --passwd速记。它尝试更改密码,步骤是确认旧密码,然后您可以在新密码提示上单击“取消”,这样可以保持密码完整。

gpg --passwd <your-user-id>
Run Code Online (Sandbox Code Playgroud)

正如Ford04所提到的,对于较新版本的 GPG,现在可以将上述命令改进为

gpg --dry-run --passwd <your-user-id>
Run Code Online (Sandbox Code Playgroud)

这是更好的。请参阅提交

  • 这确实是最简单的方法,无论您是否启用了“gpg-agent”,它都有效。 (2认同)
  • 或者甚至更好:`gpg --passwd --dry-run &lt;user-id&gt;`。从手册页 `--passwd` 中:“当与选项 `--dry-run` 一起使用时,这实际上不会更改密码,而是检查当前密码是否正确。” (2认同)

小智 10

Shorter command line to check if passphrase is ok

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


MaX*_*i32 5

警告不要gpg -o /dev/null按照此处最佳答案的建议使用 echo。这将导致 /dev/null 具有无效权限并损坏文件/dev/null。您可以在运行此命令时验证 /dev/null 文件的权限来证明这一点。

你可以使用这个:

echo "1234" | gpg -q --batch --status-fd 1 --sign --local-user $KEY_ID --passphrase-fd 0 > /dev/null
Run Code Online (Sandbox Code Playgroud)

我还为此创建了 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
Run Code Online (Sandbox Code Playgroud)

如果 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:
Run Code Online (Sandbox Code Playgroud)

如果输入无效密码,则输出示例(它将继续询问):

[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:
Run Code Online (Sandbox Code Playgroud)

输入有效密码后的示例输出:

[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
Run Code Online (Sandbox Code Playgroud)

缓存有效密码后,下次运行此脚本时,它不会要求您输入密码。所以这个脚本给出了你的问题的解决方案;“只需确认我使用了正确的密码”