如何使用GPG对消息进行加密和签名

来自菜鸟教程
跳转至:导航、​搜索

介绍

GPG 或 GNU Privacy Guard 是一种公钥加密实现。 这允许在各方之间安全地传输信息,并可用于验证消息的来源是否真实。

在本指南中,我们将讨论 GPG 的工作原理以及如何实现它。 我们将使用 Ubuntu 16.04 服务器进行此演示,但也会包含其他发行版的说明。

公钥加密的工作原理

许多用户面临的一个问题是如何安全地进行通信并验证他们正在与之交谈的一方的身份。 许多试图回答这个问题的方案至少在某些时候需要通过不安全的介质传输密码或其他识别凭证。

确保只有目标方可以阅读

为了解决这个问题,GPG 依赖于一种称为公钥加密的安全概念。 这个想法是您可以将传输的加密和解密阶段分成两个单独的部分。 这样,只要您保护解密部分,您就可以自由分发加密部分。

这将允许任何人都可以创建和加密的单向消息传输,但只能由指定的用户(具有私有解密密钥的用户)解密。 如果双方都创建了公钥/私钥对并相互提供了他们的公钥加密密钥,那么他们就可以相互加密消息。

所以在这种情况下,每一方都有自己的私钥和其他用户的公钥。

验证发件人的身份

该系统的另一个好处是消息的发送者可以用他们的私钥“签名”消息。 接收者拥有的公钥可用于验证签名实际上是由指定用户发送的。

设置 GPG 密钥

GPG 在大多数发行版中默认安装。

如果由于任何原因未安装 GPG,在 UbuntuDebian 上,您可以更新本地 repo 索引并通过键入以下命令进行安装:

sudo apt-get update
sudo apt-get install gnupg

CentOS 上,您可以通过键入以下命令安装 GPG:

sudo yum install gnupg2

要开始使用 GPG 加密您的通信,您需要创建一个密钥对。 您可以通过发出以下命令来执行此操作:

gpg --gen-key

这将引导您完成一些配置密钥的问题:

  • 请选择您想要的密钥类型:(1) RSA 和 RSA(默认)
  • 你想要什么尺寸的钥匙? 4096
  • 密钥有效吗? 1y(1 年后到期。 如果您只是在测试,您可能希望在第一次创建一个短期密钥,而使用像“3”这样的数字。)
  • 它是否正确? y
  • 真实姓名:这里是你的真实姓名
  • 电子邮件地址:your_email@address.com
  • 评论:将在您的签名中可见的可选评论
  • 更改 (N)ame、©omment、(E)mail 或 (O)kay/(Q)uit? O
  • 输入密码: 在此处输入安全密码(大小写、数字、符号)

此时,gpg 将使用熵生成密钥。 Entropy 描述了系统中存在的不可预测性和不确定性的数量。 GPG 需要这个熵来生成一组安全的密钥。

此过程可能需要很长时间,具体取决于您的系统的活跃程度和您选择的密钥大小。 要更轻松地生成额外的熵,您可以 使用名为 haveged 的工具。 打开一个新终端并再次通过 SSH 连接到服务器以在您的服务器上设置 haveged

创建吊销证书

您需要有一种方法使您的密钥对失效,以防出现安全漏洞或丢失您的密钥。 使用 GPG 软件有一种简单的方法可以做到这一点。

这应该在您制作密钥对后立即完成,而不是在您需要时完成。 此吊销密钥必须提前生成并保存在安全、独立的位置,以防您的计算机受到威胁或无法操作。 要生成撤销密钥,请键入:

gpg --output ~/revocation.crt --gen-revoke your_email@address.com

系统将要求您确认撤销密钥的创建,然后提示您撤销密钥的原因。 如果将来使用撤销,此信息将对其他用户可见。 您可以选择任何可用的选项,但由于这是提前完成的,因此您不会知道具体细节。 通常,为每个可能的场景创建一个吊销证书以获得最大的灵活性是一个好主意。

之后,您将被要求提供评论,最后确认选择。 在创建吊销证书之前,您需要输入 GPG 密钥的密码来确认您的身份。 吊销证书将被写入由 --output 标志指定的文件(在我们的示例中为 revocation.crt):

OutputRevocation certificate created.

Please move it to a medium which you can hide away; if Mallory gets
access to this certificate he can use it to make your key unusable.
It is smart to print this certificate and store it away, just in case
your media become unreadable.  But have some caution:  The print system of
your machine might store the data and make it available to others!

您应该立即限制生成的证书文件的权限,以防止未经授权的访问:

chmod 600 ~/revocation.crt

吊销证书必须保持安全,以便其他用户无法吊销您的密钥。 如消息所述,您应该考虑将证书备份到其他机器并打印出来,只要您可以正确保护它。

如何导入其他用户的公钥

如果您不能接受您希望与之交流的人的其他公钥,那么 GPG 将毫无用处。

您可以通过多种方式导入某人的公钥。 如果你在文本文件中从某人那里获得了公钥,GPG 可以使用以下命令导入它:

gpg --import name_of_pub_key_file

您希望与之通信的人也有可能已将其密钥上传到公钥服务器。 这些密钥服务器用于存放来自世界各地的人们的公钥。

将其信息与各种其他服务器同步的流行密钥服务器是 MIT 公钥服务器。 您可以在 Web 浏览器中按姓名或电子邮件地址搜索人员:

https://pgp.mit.edu/

您还可以通过键入以下内容从 GPG 中搜索密钥服务器:

gpg --keyserver pgp.mit.edu  --search-keys search_parameters

您可以使用这种按姓名或电子邮件地址搜索的方法。 您可以按照提示导入找到的密钥。

如何验证和签署密钥

虽然您可以自由分发您生成的公钥文件,人们可以使用它以安全的方式与您联系,但重要的是要能够相信该密钥属于您认为它在初始公钥传输期间所拥有的人。

验证其他人的身份

你怎么知道给你公钥的人就是他们所说的那个人? 在某些情况下,这可能很简单。 您可能正坐在您的笔记本电脑打开和交换钥匙的人旁边。 这应该是一种非常安全的方式来识别您正在接收正确、合法的密钥。

但还有许多其他情况下无法进行此类个人接触。 您可能不认识对方,也可能因为物理距离而分开。 如果您不想通过不安全的渠道进行通信,那么验证公钥可能会出现问题。

幸运的是,您无需验证双方的全部公钥,只需比较从这些密钥派生的“指纹”即可。 这将为您提供一个合理的保证,即你们都使用相同的公钥信息。

您可以通过键入以下内容获取公钥的指纹:

gpg --fingerprint your_email@address.com
Outputpub   4096R/311B1F84 2013-10-04
      Key fingerprint = CB9E C70F 2421 AF06 7D72  F980 8287 6A15 311B 1F84
uid                  Test User <test.user@address.com>
sub   4096R/8822A56A 2013-10-04

这将产生一个更易于管理的数字串进行比较。 您可以将此字符串与此人本人或有权访问该人的其他人进行比较。

签署他们的钥匙

签署密钥会告诉您的软件您信任已提供给您的密钥,并且您已验证它与相关人员相关联。

要签署您已导入的密钥,只需键入:

gpg --sign-key email@example.com

当您签署密钥时,这意味着您确认您相信该人就是他们声称的那个人。 这可以帮助其他人决定是否也信任那个人。 如果有人信任您,并且他们看到您已经签署了此人的密钥,那么他们可能也更有可能信任他们的身份。

您应该允许您正在为其签名的密钥的人通过将签名密钥发回给他们来利用您的信任关系。 您可以通过键入以下内容来执行此操作:

gpg --output ~/signed.key --export --armor email@example.com

您必须再次输入密码。 之后,将显示由您签名的他们的公钥。 把这个发给他们,这样他们就可以在与他人互动时从获得你的“认可印章”中受益。

当他们收到这个新的签名密钥时,他们可以导入它,将您生成的签名信息添加到他们的 GPG 数据库中。 他们可以通过键入:

gpg --import ~/signed.key

他们现在可以向其他人证明 相信他们的身份是正确的。

如何使您的公钥高度可用

由于公钥加密的设计方式,如果未知人拥有您的公钥,则不会发生任何恶意行为。

考虑到这一点,公开您的公钥可能是有益的。 然后,人们可以从您的第一次互动中找到您的信息,以便安全地向您发送消息。

您可以通过从 GPG 系统请求您的公钥来向任何人发送您的公钥:

gpg --output ~/mygpg.key --armor --export your_email@address.com
Output-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.11 (GNU/Linux)

mQINBFJPCuABEACiog/sInjg0O2SqgmG1T8n9FroSTdN74uGsRMHHAOuAmGLsTse
9oxeLQpN+r75Ko39RVE88dRcW710fPY0+fjSXBKhpN+raRMUKJp4AX9BJd00YA/4
EpD+8cDK4DuLlLdn1x0q41VUsznXrnMpQedRmAL9f9bL6pbLTJhaKeorTokTvdn6
5VT3pb2o+jr6NETaUxd99ZG/osPar9tNThVLIIzG1nDabcTFbMB+w7wOJuhXyTLQ
JBU9xmavTM71PfV6Pkh4j1pfWImXc1D8dS+jcvKeXInBfm2XZsfOCesk12YnK3Nc
u1Xe1lxzSt7Cegum4S/YuxmYoh462oGZ7FA4Cr2lvAPVpO9zmgQ8JITXiqYg2wB3
. . .

然后,您可以通过适当的介质将此文件发送给另一方。

如果您想将您的密钥发布到密钥服务器,您可以通过大多数服务器站点上可用的表单手动完成。

另一种选择是通过 GPG 接口执行此操作。 通过键入以下内容查找您的密钥 ID:

gpg --list-keys your_email@address.com

下面输出中突出显示的部分是密钥 ID(如果您不确定要使用哪一个,请在左侧列中查找 pub)。 这是一种引用内部软件密钥的简短方法。

Outputpub   4096R/311B1F84 2013-10-04
uid                  Test User <test.user@address.com>
sub   4096R/8822A56A 2013-10-04

要将您的密钥上传到某个密钥服务器,您可以使用以下语法:

gpg --send-keys --keyserver pgp.mit.edu key_id

密钥将上传到指定的服务器。 之后,它可能会分发到世界各地的其他关键服务器。

使用 GPG 加密和解密消息

与对方共享密钥后,您可以轻松地加密和解密消息。

加密消息

您可以使用 GPG 的“–encrypt”标志来加密消息。 基本语法是:

gpg --encrypt --sign --armor -r person@email.com name_of_file

这使用收件人的公钥加密消息,使用您自己的私钥对其进行签名以确保它来自您,并以文本格式而不是原始字节输出消息。 文件名将与输入文件名相同,但扩展名为 .asc

如果您希望能够阅读加密邮件,您应该使用您自己的电子邮件地址添加第二个“-r”收件人。 这是因为消息将使用每个人的公钥加密,并且只能使用关联的私钥解密。

因此,如果它只是用对方的公钥加密,你将无法再次查看该消息,除非你以某种方式获得了他们的私钥。 将您自己添加为第二个收件人会分别对邮件进行两次加密,每个收件人一次。

解密消息

当您收到消息时,只需在消息文件上调用 GPG:

gpg file_name.asc

软件会根据需要提示您。

如果您将消息作为原始文本流而不是文件,则可以在不带任何参数的情况下键入 gpg 后复制并粘贴它。 您可以按“CTRL-D”表示消息结束,GPG 将为您解密。

密钥维护

您可能需要定期使用许多过程来管理您的密钥数据库。

要列出您从其他人那里获得的可用 GPG 密钥,您可以发出以下命令:

gpg --list-keys

如果您依赖从公钥服务器提取的信息,您的密钥信息可能会过时。 您不想依赖已撤销的密钥,因为这意味着您信任可能被泄露的密钥。

您可以通过发出以下命令来更新密钥信息:

gpg --refresh-keys

这将从密钥服务器获取新信息。

您可以使用以下方法从特定密钥服务器中提取信息:

gpg --keyserver key_server --refresh-keys

如果在密钥服务器上找不到任何密钥,您可能会收到错误消息。

结论

正确使用 GPG 可以帮助您保护与不同人的通信。 这非常有用,尤其是在处理敏感信息时,而且在处理常规的日常消息时也是如此。

由于监视程序可以标记某些加密通信的方式,建议对所有内容使用加密,而不仅仅是“秘密”数据。 这将使人们更难知道您何时发送重要数据或只是发送友好的问候。