GPG:你未使用的最佳免费加密工具,第一部分,共二部分

作者:Michael D. Bauer

在 Phil Zimmermann 发布 PGP v.1.0 (Pretty Good Privacy) 十年后,PGP 已经从偏执狂的地下工具发展成为电子邮件加密的黄金标准,甚至是互联网标准。GnuPG,即 GNU 隐私卫士,是商业 PGP 的 100% 免费替代品,并且包含在大多数 Linux 发行版中。然而,需要它(并且已经拥有它)的人们却远没有充分利用它。

您是否也是世界上众多 GnuPG 拖延者中的一员? 希望在阅读本月和下个月的专栏后,您将不再是。在您生成个人密钥、发送您的第一封加密电子邮件,并最终验证您下载的酷炫软件包的安全签名后,您会很高兴自己费力掌握了 GnuPG 这个多功能奇迹。

本月我们将从 PGP/GnuPG 的背景、概念和快速入门开始。下个月我们将深入探讨文件和电子邮件加密、密钥管理和图形用户界面。

关于 PGP 历史的一些说明,以及为什么本文不是关于 PGP 的

早在 1991 年,当美国国会似乎即将宣布所有私人使用密码软件为非法时,Phil Zimmermann 发布了 PGP v.1.0。这个最初免费的工具允许消费级计算机系统的普通用户有效地加密他们的个人数据和通信,足以阻止甚至是有决心且资金充足的窃听者(例如,美国政府)。

Phil Zimmermann 的故事重要且引人入胜,可以在 Simson Garfinkel 的书中和 Phil 自己的主页上阅读(请参阅“资源”)。但现在只需说,尽管经历了政府调查、专利纠纷和公司整合的磨难,PGP 仍在不断改进和发展,以服务于 Zimmermann 保护全球个人和组织隐私的愿景。

然而,当我这样说时,我真正指的是广义上的 PGP,包括 OpenPGP 和 GnuPGP。后两者的出现分别导致 PGP 的密钥和消息格式成为 RFC 2440 中的互联网标准,并为全球用户提供了完全免费且不受(专利)约束的 PGP 实现。

虽然按照任何合理的标准,Zimmermann 先生都是开源软件的真正先驱和贡献者之一,但 Network Associates Inc. (NAI) 的产品 PGP 对于 Linux 用户特别是开源拥护者来说存在问题。首先也是最明显的是,商业 PGP 仅在 Windows 和 Mac OS 上运行。

其次,即使是 PGP Freeware 也仅对非商业用户免费,即教育和非营利环境中的用户。第三,NAI 已决定大幅减少其提供的 PGP 源代码量,以供同行评审和公众监督,即使对于 Freeware PGP 也是如此。

最后的发展显然促成了 Phil Zimmermann 从 PGP Security 辞职,并让人怀疑是否应该完全信任 NAI 版本的 PGP。考虑到美国政府对 PGP 的敌意以及各种政府要求在密码软件(包括密钥托管)中设置“后门”的努力,人们很容易想象 NAI 会悄悄屈服于政府压力并创建这样的后门。如果不对 PGP 的完整源代码进行公众监督,我们就无法验证 NAI 关于这现在不是将来也不会是事实的断言。

另一方面,GnuPG 是一个 100% 开源且 100% 免费的软件包,它完成了 PGP 大部分的工作(它缺少某些功能,例如虚拟专用网络和磁盘卷加密,这些功能包含在 PGP Desktop 中)。在很短的时间内,GnuPG 已成为 Linux 用户首选的电子邮件和数据加密工具,并与大多数当前的 Linux 发行版打包在一起。GnuPG 项目由 Werner Koch 领导,其代码主要由他开发。

GnuPG 是什么以及为什么你需要它

GNU 隐私卫士由一个单二进制可执行文件 gpg 组成。实际上还有一个额外的二进制文件 gpgv,但由于 gpgv 仅提供 gpg 功能的方便子集,您仍然可以将 gpg 视为基本上是独立的。因此,可以互换使用术语 GnuPG 和 gpg——我将在本文的其余部分这样做。我也将对术语 PGP 采取宽松的态度——我将不再使用 Network Associates 的特定商业产品,而是使用 PGP 来指代 PGP、OpenPGP 和 GnuPG 共有的协议、机制和信任网络。

GnuPG 执行四个基本功能,其所有其他功能都是对这些功能的补充:加密数据、解密数据、密码签名数据和密码验证数字签名。它还用于创建和管理密钥,这些活动虽然从属于上面列出的四个功能,但在安全地执行这些功能方面绝对至关重要。

实际上,这意味着人们通常使用 GnuPG 加密文件,尤其是电子邮件;解密发送给他们的邮件或文件;数字签名文档、源代码分发和其他电子文件;验证其他人的数字签名,以确定给定文件是否与其随附的签名匹配(即,在任何时候都没有被篡改),以及该文件是否经过可验证的由声称签名的人签名;并维护密钥环(密钥数据库),其中包含他们的个人密钥或密钥(他们的秘密密钥环)以及他们的朋友、同事、商业伙伴等的公钥(他们的公共密钥环)。

显然,如果您希望与其他 GnuPG 用户(以及其他符合 OpenPGP 标准的软件的用户)交换加密消息和文件,那么您需要 GnuPG。如果您希望加密本地存储但位于不太受信任的位置的数据,例如您随身携带并准备好被盗的笔记本电脑的硬盘驱动器,这也是您的选择之一。

但是,即使您的朋友中没有人使用 GnuPG 或 PGP,即使您觉得您的任何数据都不值得用加密来保护,仍然有一个非常令人信服的理由至少了解一点关于使用 GnuPG 的知识:软件分发签名。由于互联网上公共 FTP 站点发生多起高调入侵事件,其中软件包被替换为受损(特洛伊木马化)版本,因此安全软件开发人员普遍采用分发其软件分发包的数字签名。

公钥密码学的工作原理(缩略版)

我们已经在“OpenSSH 的 101 个用途,第二部分,共二部分”(2001 年 2 月的 LJ)中介绍了公钥密码学 (PK crypto) 的基础知识。但这是一个非常重要和基础的主题,因此值得讨论它如何应用于 GnuPG。

请记住,前提很简单:在 PK 密码学中,每个人都有一对密钥,一个公钥和一个私钥。公钥用于加密 intended 给公钥所有者的数据,并验证使用持有者的私钥创建的数字签名。私钥用于解密使用相应公钥加密的数据,并创建数字签名。

顾名思义,公钥旨在广泛分发;任何人都可以向您发送加密数据,任何人都可以验证数字签名是否由您创建。相反,私钥必须是真正保密的,并受到严密保护,防止未经授权的复制或使用;只有您应该能够解密 intended 给您查看的数据,只有您应该能够创建声称来自您的数字签名。

公钥可以通过任意多种方式分发。重要的是它们的完整性,而不是它们的保密性。但是您必须通过将其存储在安全位置来保护您的私钥,例如只有您具有读取权限的目录,并通过使用长而强的密码短语锁定它,该密码短语必须在使用私钥之前输入(我稍后会告诉您如何执行此操作)。

所有 PK 密码系统都有许多共同点。SSH 和 PGP/GnuPG(以及其他 PK 应用程序)的区别在于公钥的分发和身份验证。这很重要;无论您多么有效地保护您的私钥,如果没有人能够区分您的真实公钥和您的敌人分发的欺诈性公钥,您仍然会遇到问题。(有关我所指的这类问题的示例,请参阅侧边栏“对有意义的信任的需求”。)

对有意义的信任的需求

在 SSH 中,这个问题实际上没有解决。如果您的朋友 Bob 希望能够使用他的 DSA 密钥对登录到您的服务器,并通过电子邮件向您发送他的公钥,那么如何验证您在收件箱中收到的密钥与他发送的密钥相同,这取决于你们两个人。(最有可能的是,您只需给 Bob 打电话,并将密钥的一部分读回给他。)

在 GnuPG 和 PGP 中,有用于验证密钥的机制,但使用这些机制取决于您。这些机制构成了信任网络。

信任网络

信任网络并不难理解。如果 Bob 认识 Ted 并为他担保,那么任何认识 Bob 的人都可以信任 Ted。因此,如果 Bob 使用他自己的(Bob 的)私钥签署 Ted 的公钥,那么 Ted 可以将此签名与他自己的(Ted 的)公钥一起分发,以便任何拥有 Bob 公钥的人都可以通过验证此签名来查看 Bob 是否为 Ted 的公钥的有效性担保。

为 Ted 担保并签署其公钥的人越多,第一次收到 Ted 公钥的人就越有可能对照他们知道是好的公钥来检查它。

这甚至扩展到 Ted 的签名伙伴的密钥。如果 Ted 将他的公钥发送给我,但我既不认识 Ted 也不认识 Bob,那么 Bob 的签名对我来说一点印象都没有。但是,如果Bob 的密钥是由我的好朋友 Alice(我拥有并信任她的公钥)签名的,那么我可以信任 Bob 的密钥,因此也可以信任 Ted 的密钥。因此得名“网络”。

顺便说一句,这与公钥基础设施 (PKI)(例如 Entrust 和 VeriSign)背后的模型截然不同,在 PKI 中,单个受信任的实体为所有公钥担保。信任网络虽然肯定不完善,但没有单点故障;信任是分散的。(有关 VeriSign 信任模型失败的示例,请参阅侧边栏。)

信任网络的主要弱点是,除非大量用户费力地签署彼此的密钥并检查其他密钥签名的有效性,否则就没有网络。可悲的是,单独(未签名)密钥的现象太常见了。但是您的密钥不会不签名,对吗?(当然不会!仅仅通过阅读本文,您就已经走在帮助加强 PGP/GnuPG 信任网络的道路上。)

顺便说一句,既然我提到了 PKI,我应该指出,虽然有 PGP 密钥服务器用作公钥存储库,但这纯粹是为了方便。与 PKI 不同,在 PKI 中,根据定义,从证书颁发机构(密钥服务器)获得的任何密钥都可以信任,但在信任网络中,情况根本不是这样。将 PKI 证书颁发机构视为县法院,将 PGP 密钥服务器视为俱乐部通讯;您可以从两者中找到某人的生日,但它们服务于两个非常不同的目的,因此可信度大相径庭。

获取、编译和安装 GnuPG

正如我在开头提到的,GnuPG 现在是大多数 Linux 发行版中的标准软件包。与所有安全软件一样,保持最新版本尤为重要,因此即使您的发行版包含 gpg,您也需要不时查看 http://www.gnupg.org/,以便您了解何时发布新版本。

自然地,这个网站也是您可以获取 GnuPG 最新源代码发布版本的地方。如果您需要或希望从源代码构建 GnuPG,只需将 tarball 下载到您选择的目录(/usr/src 是一个不错的选择),然后执行以下命令

cd /usr/src
tar -xzvf gnupg-1.0.6.tar.gz
cd gnupg-1.0.6
./configure
make
make check
make install

请注意,您的 tarball 名称可能不同;截至撰写本文时,GnuPG v1.0.6 是最新版本,但在您阅读本文时可能不是。这同样适用于从 tarball 中提取的目录。

另请注意,make check 命令是可选的,并且有点耗时,但我认为它很有用:它打印出有关受支持的加密算法的一些有趣信息,并运行一系列测试,让您立即知道 gpg 是否构建正确。如果这些测试中的任何一个失败,那么在您解决问题之前,运行 make install 就没有任何意义。在不太可能发生的测试失败事件中,请参阅文件 INSTALL 和 README,以查找有关原因的线索。

gpg 应该设置为 SetUID=Root 吗?

您可能知道,通常情况下,应避免以设置了 SUID(设置用户 ID)位的方式运行程序。SUID 位可以使用 chmod 命令为每个文件设置,它使可执行程序以其所有者的权限运行,而与谁运行它无关。

例如,如果程序的文件权限的用户部分中有一个 s 而不是 x(如 s -l 显示的那样),并且该程序归 root 所有,那么每次执行该程序时,它都将具有与 root 相同的系统权限;它将能够执行 root 可以做的所有事情。

有时程序安装时不必要地设置了此位,并且所有权分配给 root。但是,这不是其中一种情况。您真的应该运行 gpg SETUID (SETUID=root,因为 root 拥有 gpg),以减轻恶意用户读取包含 gpg 私钥或其密码短语的内存的风险。

在 make install 完成后,我建议您使用以下命令设置此位

chmod u+s /usr/bin/gpg
快速而简陋的 GnuPG:验证文件签名

在您安装了 gpg(无论是从上面描述的源代码安装还是从您的 Linux 安装介质安装)之后,您就可以创建个人密钥对并开始构建您自己的小小的信任网络角落了。但我已经到了本月专栏的结尾,所以让我们做一些不需要我们拥有自己的密钥对的事情:验证其他人创建的签名。

正如我之前提到的,数字签名软件包已成为向最终用户提供验证他们下载的软件与其开发人员在线发布的软件是否相同的手段的流行方式。

验证分离签名的命令(PGP 签名可以附加到为其创建的文件,也可以单独存储在自己的文件中)是 gpgv。如果我们在签名上调用此命令,但没有签名者的公钥副本,则 gpgv 将返回错误。在列表 1 中,我们看到了发生这种情况的会话。

列表 1. 示例签名验证会话

让我们剖析一下列表 1。总共调用了三个命令

gpgv gpa-0.4.1.tar.gz.sig
gpg --keyserver pgp.mit.edu --recv-keys 621CC013
gpgv --keyring pubring.gpg gpa-0.4.1.tar.gz.sig

第一次运行 gpgv(您可能还记得它是用于验证签名的 gpg 命令的简化版本)时,我只是提供了我希望验证的分离签名的名称。如果我的 gpgv 密钥环 $HOME/.gnupg/trustedkeys.gpg 上有适当的公钥,则此命令会成功,但我没有,所以它没有成功。

因此,在第二个命令中,我运行了常规 gpg 命令,其中包含 --recv-keys 指令,后跟 gpgv 告诉我用于创建签名的密钥的 ID。我还指定 gpg 应该在密钥服务器 pgp.mit.edu 上查找此密钥。密钥在那里,因此此命令成功。

在第三个命令中,我意识到我刚刚将密钥下载到我的默认密钥环 $HOME/.gnupg/pubring.gpg,因此我在重新运行 gpgv 时使用了 --keyring 参数。这次它成功了!

当然,示例中只遗漏了一件事,那就是验证我费力下载的密钥实际上是否来自其所谓的拥有者 Werner Koch。我确实这样做了——在 www.google.com 上搜索“621CC013 werner koch”花了 20 秒,结果出现了很多邮件列表帖子和网站,Werner 在他的电子邮件签名中包含了这个密钥 ID。

如果有人成功入侵了我下载的网络服务器,用特洛伊木马或病毒替换文件以及用伪造密钥创建的签名,然后在 pgp.mit.edu 上发布伪造密钥,那么通过像我所做的快速网络搜索,他们的诡计很容易被检测到。我非常怀疑即使是最勇敢的作恶者也能成功删除或更改所有网站、Usenet 存档等,将他或她的受害者的姓名链接到伪造密钥以外的其他密钥。因此,您会看到,信任网络可以发挥作用,前提是有人不时费心进行一些后续工作。

本月的空间已经用完了,但是 GnuPG 还有很多更有用的功能,我们将在下次深入讨论。我希望您不会等到那时才尝试它们!

资源

Mick Bauer (mick@visi.com) 是双子城地区的网络安全顾问。自 1995 年以来,他一直是 Linux 爱好者,自 1997 年以来,他一直是 OpenBSD 狂热者,他喜欢让这些尖端的操作系统在过时的垃圾硬件上运行。

加载 Disqus 评论