经过这么多小时的努力,我不得不问这个事实已经告诉我,这两个陈述中至少有一个是正确的:
- 我正在做一些非常错误的事情。
- PGP/GPG 绝对是一团糟,它故意使工作变得尽可能困难和混乱。
基本上,我的系统会自动导入发送给我的任何 PGP 公钥块,以便能够在消息外出时自动加密消息(作为回复发送给我)。
当您使用 PGP/GPG 加密纯文本消息时,您告诉程序使用哪个“接收者”。这个令人困惑的术语实际上是指存储在 GPG 中的公钥中的“全名 + 电子邮件地址”字段(出于某种原因称为“用户名”)。
好吧,当我“导入”这样一个 PGP 公钥块(有效)时,我不知道“用户名”字段是什么,如果我不知道,我实际上无法使用它,因为加密功能要我参考正确的“存储的公钥”。
但是我如何真正从公钥中提取“用户名”字段呢?你会认为当你执行 --import 命令时它会返回这个,但据我所知,它不会。我已经在手册中挖掘了几个小时,却没有找到任何与此相关的内容。
作为记录,我确实找到了这个 StackOverflow 线程:https ://security.stackexchange.com/questions/50965/extracting-the-gpg-userid-from-the-public-key-file ...但它绝对没有对我有感觉。“解决方案”已经知道并指定了某种 id,这似乎违背了整个观点,因为这本质上是我们试图找到的(除了它是“用户名”字段)。
我见过各种“常用/有用的 PGP/GPG 命令”,但没有一个甚至提到过这一点。嗯?这就像最基本也是最关键的任务……我很困惑。为什么 --import 命令不给我任何类型的 id 来使用?是吗,但以某种令人费解的方式?
确实如此,这主要是您对“可用ID”的期望大多是错误的。
该字段称为“用户 ID”。它不称为“用户名”。
许多程序(主要是
gpg
包装它的所有工具)也将仅通过电子邮件地址或用户 ID 的任何其他子字符串匹配或完整的 160 位公钥指纹或“密钥 ID”(32 /64 位截断指纹)。例如:(您可以通过将匹配传递给 来测试匹配
gpg --list-keys
,例如gpg -k fred
。)其中,通过指纹指定收件人是最安全的选项。“用户 ID”字段(无论是完整的还是部分的)只有在您使用 Web of Trust 或有其他方法来区分合法的“Fred Foobar”密钥和假的“Fred Foobar”密钥时才是安全标识符。
GnuPG 总是将此字段显示为
gpg --import
输出的一部分(以及 64 位“密钥 ID”)。例如:要在自动化工具中使用它,请使用
--status-fd
它为您提供完整的 160 位指纹。例如:如果您正在使用其他一些 PGP 软件(即不是 GnuPG)并且它没有向您显示有关它刚刚导入的密钥的任何信息,那么这是其他 PGP 软件中的 UI 问题。