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

GPG或GNU Privacy Guard是公钥加密实现。这允许在各方之间安全地传送信息,并且可以用于验证消息的来源是真实的。在本指南中,我们将讨论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”这样的数字,首次创建一个短命的密钥。)
  • 它是否正确? ÿ
  • 真名: 你的真名
  • 电子邮件地址: your_email@address.com
  • 评论: 您的签名中可见的可选注释
  • 改变(N)阿美,(C),(E)邮件或(O)凯/(Q)uit? Ø
  • 输入密码: 在此处输入安全密码(大小写,数字,符号)

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

此过程可能需要很长时间,具体取决于您的系统的活动和所选的键控。 为了更容易地生成额外的熵,可以使用一个名为hasged的工具 再次打开一个新的终端和SSH到服务器上进行设置。

创建撤销证书

如果发生安全漏洞或丢失密钥,您需要一种使密钥对失效的方法。 使用GPG软件有一个简单的方法。

一旦您制作密钥对,您就可以完成此操作,而不需要它。 必须提前生成此撤销密钥,并将其保存在安全的独立位置,以防您的计算机遭到入侵或无法使用。 要生成撤销键,请键入:

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

您将被要求确认撤销密钥创建,然后提示它被撤销的原因。 如果将来使用撤销,这些信息将对其他用户可见。 您可以选择任何可用的选项,但由于这是提前完成的,因此您将不具体。 通常,为了最大的灵活性,为每种可能的情况创建吊销证书是一个好主意。

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

Revocation 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公钥服务器是将其信息与各种其他服务器同步的流行密钥服务器。 您可以通过在您的网络浏览器中访问他们的名字或电子邮件地址搜索人:

https://pgp.mit.edu/

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

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

您可以使用此方法通过名称或电子邮件地址进行搜索。 您可以按照提示导入找到的键。

如何验证和签署密钥

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

验证其他人的身份

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

但还有许多其他情况下,这种个人联系是不可能的。 您可能不会亲自了解对方,或者您可能会因身体距离而分离。 如果你不想通过不安全的渠道进行沟通,公钥的验证可能是有问题的。

幸运的是,不用验证双方的整个公钥,只需比较从这些密钥派生的“指纹”。 这将给你一个合理的保证,你们都使用相同的公钥信息。

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

gpg --fingerprint your_email@address.com
pub   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
-----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 )。 参考内部软件的关键是一个很短的方法。

pub   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可以帮助您保护与不同人的沟通。 这是非常有用的,特别是在处理敏感信息时,而且在处理常规的日常消息时。

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