为什么在创建 OpenPGP 密钥时询问我的个人信息?

信息安全 加密 pgp gnupg 打开pgp
2021-08-17 16:34:16

今天我了解了 OpenPGP 的基础知识并尝试创建我的第一个 OpenPGP 密钥。但是,我发现了一些可疑的选项——在我下载的程序的 GUI 版本中,有诸如nameemailexpiration date 之类的字段。

  1. 为什么要求我提供姓名或电子邮件?根据我对发送和接收加密消息的基本理解,我只需要我的私钥和公钥以及另一个人的公钥,密钥的创建和加密/解密只是数学,那么为什么还有其他选择呢?我的猜测是可以将姓名和电子邮件发送到某个服务器,然后如果有人想向我发送消息(并且不知道我的公钥但知道我的电子邮件地址),如果有公钥,他们可以查找它匹配给定的电子邮件地址。我是对的,如果不是,它们是做什么用的?我可以把它们留空吗?

  2. 另一个可疑的事情是密钥应该在什么时间过期。密钥中是否包含有关到期日期的信息(我认为不是)?那么密钥是存储在某处的服务器上还是什么?它是如何工作的?

我问的原因是整个 OpenPGP 的事情似乎比我想象的更集中。为什么 OpenPGP 软件不能只有一个“生成新密钥”按钮来生成公钥和私钥供我复制和使用(当然还有加密/解密文本的选项)?

3个回答

OpenPGP 包括密钥管理

RFC 4880 的介绍开始,OpenPGP(突出显示是我):

OpenPGP 软件结合使用强公钥和对称加密技术,为电子通信和数据存储提供安全服务。 这些服务包括机密性、密钥管理、身份验证和数字签名。

换句话说,OpenPGP 不仅仅是发送加密消息,而是围绕密钥管理提供了更大的功能集。密钥管理意味着可以在密钥服务器上查找您的密钥(但它们没有在那里经过身份验证!),而且 OpenPGP 的用户也可以在他们的 OpenPGP 密钥之间颁发证书以确保真实性(例如,阅读密钥签名方)。所有这些都需要键附有名称。

“匿名”OpenPGP 密钥

为什么要求我提供姓名或电子邮件?

您不必这样做(尽管 OpenPGP 的某些实现会这样做):OpenPGP 密钥可能存在没有用户 ID,并且可以任意设置所有日期(尽管必须提供密钥创建时间戳,但您可以只提供一个时间戳 0 等于 1970-01-01)。

考虑密钥不会附加任何用户信息:您必须手动交换由数千个随机字节组成的整个密钥,如果您想使用它,必须以某种方式将其连接到一个身份。

另一个可疑的事情是密钥应该在什么时间过期。密钥中是否包含有关到期日期的信息(我认为不是)?那么密钥是存储在某处的服务器上还是什么?它是如何工作的?

不需要到期日期,您可以让它们永远有效。实际上,到期日并没有真正增加安全性,尽管如此,它可能是合理的。

您必须区分实际的公钥/私钥对(例如,用于 RSA 的素数)和 OpenPGP 密钥。OpenPGP 密钥由加密作品的数字组成,还包括用户 ID、证书和到期日期等设置等附加信息。您可以通过运行轻松查看 OpenPGP 密钥中的所有信息

gpg --export [key-id] | gpg --list-packets

(可能需要阅读上面链接的 RFC 4880 中的一些内容才能合理理解输出)。

OpenPGP 是分布式的

我问的原因是整个 PGP 事情似乎比我想象的更集中。

OpenPGP 环境中没有中心实例。密钥通过分散的密钥服务器网络进行交换,信任通过 OpenPGP 信任网络验证,而不是像 X.509 中已知的分层 PKI 系统(用于 S/MIME、TLS 等)。

OpenPGP 社区中有一些相当中央的权威机构:CAcert、德国 Heise Verlag 和 Governikus 等为新的德国数字身份证持有人颁发证书的证书权威机构存在,但您不需要使用(或信任)它们。密钥服务器网络( SKS 池)中有一些相当集中的协调,但您也可以选择任意服务器,根本不使用密钥服务器,甚至托管自己的服务器!

OpenPGP 是一个开放标准

为什么 PGP 软件不能只有一个“生成新密钥”按钮来生成公钥和私钥供我复制和使用(当然还有加密/解密文本的选项)?

OpenPGP 是一个开放标准。如果有人希望软件能够做到这一点(正如我已经提到的,OpenPGP 标准允许相当“普通”的密钥而没有大量元信息),欢迎您这样做。此类软件不存在(或未广为人知)的原因是人们看不到编写或拥有此类软件的充分理由。

如果您只想使用没有任何密钥管理和高级 OpenPGP 功能的 RSA 和 AES,那么您最好只使用更原始的标准。

首先,您不需要输入它们,或者您可以根据需要输入虚假的,所以如果您愿意,请继续输入。(您可能需要阅读禁用这些字段的选项。)

但 PGP 要求提供此类信息的原因在于,它不仅是一种加密消息的工具,它还是一种防止假冒的工具,即证明消息的发送者和接收者确实是他们声称的人。关键是,只要您控制了您的私钥(没有人从您那里窃取),并且其他人确信您的公钥属于您(信任网络已将您的公钥与您的身份绑定),现在:

  1. 向您发送消息的人可以确信他们正在与您联系,而不是冒充者;
  2. 收到您签名消息的人可以确定他们来自您,而不是冒充者。

另请注意,与您的密钥相关联的身份是您的真实姓名、别名还是其他任何身份都无关紧要——它只需要其他人能够识别您的身份即可。这只是“这是谁的钥匙”这个问题的答案?PGP 不在乎答案看起来像“Jane Smith”、“John Doe”还是“spaghettiman123”;只有尝试使用公钥的人才会关心。

另一个可疑的事情是密钥应该在什么时间过期。密钥中是否包含有关到期日期的信息(我认为不是)?那么密钥是存储在某处的服务器上还是什么?它是如何工作的?

到期日期存储在密钥中。这样做的目的是在您的私钥在您没有注意到的情况下被盗时保护您 - 到期日期意味着窃取它的人只能获得一个有限的时间窗口,在此期间他们可以冒充您。

PGP 不会自动将密钥存储在服务器中,并且不会作为日常操作的一部分连接到任何服务器。但是公钥可以并且经常被上传到密钥服务器,以便人们可以从那里下载它们。

我问的原因是整个 PGP 事情似乎比我想象的更集中。为什么 PGP 软件不能只有一个“生成新密钥”按钮来生成公钥和私钥供我复制和使用(当然还有加密/解密文本的选项)?

它不是集中式的,但它确实希望与其他系统(公共或私有)进行交互,以便理想地工作。但是您不必使用其中的任何一个。您可以只生成一个没有附加身份的密钥对。您可以亲自手动将公钥提供给交易对手,例如在闪存驱动器中,这样就可以正常工作。

这里的棘手问题是:如何通过 Internet 安全地获取他人的公钥?如果您只是从某个网站下载 Jane Doe 的公钥,您无法知道那是她的公钥还是冒充者的公钥。因此,您看到的所有额外功能都是关于提供解决该问题的工具。再次阅读信任网络公钥基础设施

存在公钥技术来解决三个主要问题:

  1. 数据机密性(加密):只有预期的接收者才能阅读消息。

  2. 数据完整性(签名):消息在传输过程中未被篡改。

  3. 身份验证:收件人实际上就是您认为的人。

可能只用这个列表的一个子集来构建密码系统(例如,磁盘加密,通常只关心 1。有时是3。)

对于像电子邮件加密这样的东西,没有第三个就没有其中两个是没有意义的。如果我不知道它属于谁,那么公钥有什么用?


从技术角度来看,您是对的:这些字段是可选的,可以留空;没有它,您的 PGP 密钥将完全可用。

从社会的角度来看,它们是必不可少的。PGP信任网络的想法是让每个人/电子邮件地址都有一个与之关联的公钥——你将你的公钥发布在公钥服务器上,让你的朋友在你的公钥上签名说“我认识这个人生命,而这个公钥确实属于他”。交叉签署彼此密钥的人越多,信任网络就越大。在这种情况下,匿名密钥毫无意义。

最后,到期日期是完全可选的,但如果您一开始就知道您只会在 X 个月内使用此密钥 - 例如,如果您与一家公司签订了短期合同。