GPG 代理在哪里存储密码——我需要恢复它

GPG 代理在哪里存储密码——我需要恢复它

我忘记了 GPG 密钥密码。

我知道我的计算机将其存储在某个地方,因为我用它解密字符串,无需密码,例如:

$ gpg --decrypt -r [email protected] ~/.password-store/gmail.gpg 
You need a passphrase to unlock the secret key for
user: "Example <[email protected]>"
2048-bit RSA key, ID 02BFF027, created 2014-10-04 (main key ID 410A4C4A)
gpg: NOTE: secret key 02BFF027 expired at Thu  4 Oct 17:30:49 2018 EDT
gpg: encrypted with 2048-bit RSA key, ID 02BFF027, created 2014-10-04
      "Example <[email protected]>"
princess

上面的输出成功解密了~/.password-store/gmail.gpg;它知道我的密钥已过期,并且知道它需要密码,但不知何故它仍然设法解密字符串(我的密码不是“公主”,这仅用于说明目的)。

我假设 GPG 代理用于将密码传递给 gpg。

是否可以做类似的事情:

gpg-agent --display-passphrase 02BFF027

答案1

密码本身是不是存储在任何地方,因此无法显示。

无论如何,解密过程都是通过重复将安全哈希算法应用于输入的密码短语和从密钥环读取的盐值(随机数)的串联来进行的。
此(计算密集型)过程返回主密钥以解密密钥环。
如果密码正确,您可以解密包含用于解密邮件消息的密钥的密钥环。
如果密码错误,您将获得错误的主密钥,该主密钥将无法验证,从而导致错误消息(并且无法解密邮件消息,因为其加密密钥未从密钥环中提取)。

答案2

维基百科:

历史上,密码以明文形式存储在系统上,但随着时间的推移,开发了额外的保护措施来保护用户的密码不被从系统中读取。盐就是其中一种方法。为每个密码随机生成一个新的盐……[并]使用加密哈希函数连接和处理,并将生成的输出(但不是原始密码)与盐一起存储在数据库中。

哈希值是不可逆的。所以密码不能轻易地从哈希中恢复。哈希值用于解密密钥,而密钥又用于解密文件/消息。

相关内容