如何使用 GPG 加密和签名消息
介绍
GPG,即 GNU Privacy Guard,是一种公钥加密实现。它允许各方之间安全地传输信息,并可用于验证消息来源的真实性。
在本指南中,我们将讨论 GPG 的工作原理以及如何实现它。我们将使用 Ubuntu 16.04 服务器进行此演示,但也将包括其他发行版的说明。
公钥加密的工作原理
许多用户面临的一个问题是如何安全地进行通信并验证他们正在交谈的一方的身份。许多试图回答这个问题的方案至少在某些时候需要通过不安全的媒介传输密码或其他身份证明。
确保只有预期方可以读取
为了解决这个问题,GPG 依赖于一种称为公钥加密的安全概念。其理念是,您可以将传输的加密和解密阶段分成两个独立的部分。这样,只要您确保解密部分的安全,您就可以自由分发加密部分。
这将允许单向消息传输,任何人都可以创建和加密,但只能由指定用户(拥有私钥解密的用户)解密。如果双方都创建公钥/私钥对并互相提供他们的公钥加密密钥,他们就可以互相加密消息。
因此在这种情况下,每一方都有自己的私钥和另一个用户的公钥。
验证发件人的身份
该系统的另一个好处是,消息发送者可以使用其私钥“签名”消息。接收者拥有的公钥可用于验证签名是否确实由指定用户发送。
设置GPG密钥
大多数发行版都默认安装 GPG。
如果由于某种原因未安装 GPG,在Ubuntu和Debian上,您可以更新本地 repo 索引并通过键入以下命令进行安装:
sudo apt-get update
sudo apt-get install gnupg
在CentOS上,你可以通过输入以下命令安装 GPG:
sudo yum install gnupg2
要开始使用 GPG 加密您的通信,您需要创建一个密钥对。您可以通过发出以下命令来执行此操作:
gpg --gen-key
这将引导您回答几个配置密钥的问题:
- 请选择您想要的密钥类型:(1)RSA 和 RSA(默认)
- 您想要什么密钥大小?4096
- 密钥的有效期是?1 年(1 年后过期。如果您只是在测试,您可能希望第一次使用数字(如“3”)创建一个短期密钥。)
- 这是正确的吗?
- 真实姓名:此处为您的真实姓名
- 电子邮件地址:your_email@address.com
- 评论:可选评论,将显示在您的签名中
- 更改 (N) 名称、@评论、(E) 邮件或 (O)kay/(Q)uit?氧
- 输入密码:在此处输入安全密码(大小写、数字、符号)
此时,gpg
将使用熵生成密钥。 熵描述了系统中存在的不可预测性和不确定性的程度。GPG 需要此熵来生成一组安全的密钥。
此过程可能需要很长时间,具体取决于您的系统活跃程度以及您选择的密钥大小。为了更轻松地生成额外的熵,您可以使用名为 haveged 的工具haveged
。打开一个新终端并再次通过 SSH 进入服务器以在您的服务器上进行设置。
创建撤销证书
您需要有一种方法来使密钥对失效,以防出现安全漏洞或您丢失了密钥。使用 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 可以帮助您保护与不同人员的通信。这非常有用,尤其是在处理敏感信息时,以及在处理日常消息时。
由于某些加密通信可能会被监控程序标记,因此建议对所有通信都使用加密,而不仅仅是“秘密”数据。这样人们就更难知道你是在发送重要数据还是只是在发送友好的问候。