如果新收到的 OpenPGP 公钥是通过经过验证的来源以签名和加密的电子邮件形式发送的,我是否必须检查该公钥的指纹?

如果新收到的 OpenPGP 公钥是通过经过验证的来源以签名和加密的电子邮件形式发送的,我是否必须检查该公钥的指纹?

众所周知,开始使用 PGP(又称 GnuPG 或 OpenPGP)加密的电子邮件关系时,A 和 B 双方必须交换公钥。第一步不能通过加密邮件完成,因为对方不知道必要的公钥。但可以通过签名邮件完成,因为发件人有自己的私钥,这是计算签名所必需的。

如果中间人 (MIM) 介入该阶段,并继续干扰 A 和 B 之间随后的邮件交换,MIM 可能会用伪造的 public(A,MIM) 交换 A 的公钥,而 MIM 会保留私钥 private(A,MIM)。MIM 还可以用 private(A,MIM) 签署消息。伪造但“正确”签名且未加密的邮件在 B 收到时看起来完全正常。

现在 B 已经收到一些对他来说像是 A 的公钥的东西,所以他甚至可以继续用签名和加密的电子邮件交换密钥。但这并不能让情况变得更好:

如果 B 将他的公钥(B)返回给 A,MIM 可能会用他自己生成的公钥(B,MIM)替换它,并用他保留的私钥(B,MIM)对其进行签名。他会用公钥(A)对其进行编码,因此 A 会收到一封加密和签名的邮件,邮件中附有公钥,但这不是 B 真正的公钥。但 A 可以解码邮件和所含的密钥,由于一切看起来都很好,他可能会使用它。但随后 MIM 可以将自己插入 A 和 B 之间每次后续的电子邮件交换中,甚至可以根据需要更改交换的签名和加密消息。

为了防止此类情况发生,建议 OpenPGP 用户检查交换公钥的指纹,并使用电子邮件以外的其他方式,以免落入此类陷阱可能的 MIM。如果双方互相检查对方各自公钥的指纹,他们就会检测到 MIM 的干预。

我的问题是:

一旦 OpenPGP 交换已通过指纹比对得到验证(即没有发生 MIM 攻击,并且 MIM 无法继续进行上述替代攻击),是否还需要检查另一个新公钥的指纹,如果例如 A 生成一个新的公钥 public'(A)并使用最初验证过的公钥(B)将其通过签名和加密邮件发送给 B?B 是否必须通过独立于电子邮件的方式再次验证收到的密钥公钥(A)?

在这种情况下,MIM 的干预方案是什么?我的理由是:

  1. MIM 必须先解密 A 发给 B 的消息,但他无法解密,因为该消息是用 B 的公钥加密的,而 MIM 没有对应的私钥。不过,MIM 可以附加另一个公钥,而他保留了自己的私钥,就像上面的场景一样。

    MIM 甚至可以用伪造的密钥对消息进行签名,因此 B 会收到一条看似安全的加密签名消息。然而,原始消息的其余部分很可能是完全错误的,或者 MIM 必须隐藏它或提供其他内容,因为 MIM 无法解密真实消息。

  2. 如果 B 在没有检查指纹的情况下接受了错误的公钥,他可能会用加密和签名的消息回答 A,而 MIM 可以读取这些消息并用其他内容替换。但他无法为 A 正确加密消息,因为他没有公钥'(A)。结论是只接受加密的签名的电子邮件(尽管很多人并不清楚这一点)。

  3. 有人可能会说 MIM 可能通过其他方式收到了 public'(A)。在这种情况下,他可能能够对 B 发给 A 的经过操纵的邮件进行编码。但由于缺少 private(B),他将无法对其进行签名,因为他没有 A 信任的替代 private(B,MIM),如上述场景所示。

这个推理有什么问题吗?

是否可以将“在信任公钥之前务必检查指纹”的规则放宽为“......除非通过签名和加密的消息接收到新密钥,并且对方的先前密钥之前已经过验证”。

相关内容