标签 GPG 下的文章

GnuPG,俗称 GPG,是一个非常通用的工具,被广泛用作电子邮件、信息、文件或任何你需要安全地发送给别人的东西的加密行业标准。

学习使用 GPG 很容易,你可以在几分钟内就学会使用它。

在本教程中,我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程,你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令,并在你完全陌生的情况下理解它。

请先阅读整个教程,然后开始自己做。

GPG 是如何进行加密的?

GPG 加密

要使用 GPG,你首先需要有一个 GPG 密钥。

GPG 密钥是你在后面的教程中用来加密(或解密)文件的东西。它也是用来识别你的身份的,你的名字和电子邮件也会与密钥绑定。

GPG 密钥的工作原理是使用两个文件,一个私钥和一个公钥。这两个密钥是相互联系的,并且 GPG 的所有功能都需要使用它们,特别是对文件加密和解密。

当你用 GPG 加密一个文件时,它使用的是私钥。然后,这个新的加密文件只能用配对的公钥进行解密。

私钥,顾名思义,是以私下的、不给任何人看的方式来存储的密钥。

另一方面,公钥是用来给其他人的,或者你希望能够解密你的文件的任何人。

这就是 GPG 的加密方法的主要作用。它允许你对文件进行本地加密,然后允许其他人确保他们收到的文件实际上是由你发送的。因为他们能够解密文件的唯一方法是使用你的公钥,而这只有在文件首先使用你的私钥加密的情况下才有效。

反之,其他人可以用你的公钥对文件进行加密,而唯一能够解密的方法是用你的私钥。因此,允许其他人公开发布文件,而不用担心除了你以外的人能够阅读它们。(LCTT 译注:另外一个常见的用例是你用你的私钥对公开发布的文件进行签名,别人使用你的公钥通过验证你的签名而确信文件是你发布的、并没有被篡改。但本文没有涉及这个用例。)

换句话说,如果一个文件是用私钥加密的,它只能用相应的公钥解密。而如果一个文件是用公钥加密的,它只能用相应的私钥解密。

你已经在使用 GPG 而没有意识到

一个最常见的使用 GPG 的例子是在 Linux 软件包管理器中,特别是 外部仓库。你把开发者的公钥添加到你系统的可信密钥中。开发者用他/她的私钥签署软件包(生成签名)。由于你的 Linux 系统拥有该公钥文件,它就能理解该软件包实际上是来自受信任的开发者。

许多加密服务在你没有意识到的情况下使用了某种 GPG 的实现。但现在最好不要去研究这些细节。

现在你对这个概念有点熟悉了,让我们看看如何使用 GPG 来加密一个文件,然后用它来解密。

用 GPG 对文件进行加密和解密

这是一个非常简单的场景。我假定你只有一个系统,你想看看 GPG 是如何工作的。你并没有把文件发送到其他系统。你对文件进行加密,然后在同一个系统上解密。

当然,这不是一个实际的用例,但这也不是本教程的目的。我的目的是让你熟悉 GPG 命令和功能。之后,你可以在现实世界中使用这些知识(如果需要的话)。为此,我将告诉你如何与他人分享你的公钥。

第一步:安装 GPG

GPG 可以在大多数发行版的软件库中找到,开箱即用。

在基于 Debian 和 Ubuntu 的系统中,安装 gpg 包:

sudo apt install gpg

如果你使用 基于 Arch 的发行版,用 pacman 命令 安装 gnupg 软件包:

sudo pacman -S gnupg

第二步:生成一个 GPG 密钥

在你的系统上生成一个 GPG 密钥只需要一条简单的命令。

只要运行下面的命令,就会生成你的密钥(你可以对大多数问题使用默认值,如下面的下划线部分所示)。

gpg --full-generate-key

生成 GPG 密钥

检查 GPG 密钥

然后你可以通过使用 --list-secret-keys--list-public-keys 参数,分别看到私钥和公钥都是通过 pub 下显示的那个 ID 相互绑定的。

列出 GPG 密钥

第三步:用 GPG 加密一个文件

现在你已经设置了 GPG 密钥,你可以开始对我们的文件进行加密了。

使用下面的命令来加密文件:

gpg --encrypt --output file.gpg --recipient [email protected] file

让我们快速浏览一下该命令的内容:

首先,你指定了 —encrypt 选项。这告诉 GPG,我们将对一个文件进行加密。

接下来,你指定了 --output file.gpg。这可以是任何名字,不过惯例是给你要加密的文件的名称加上 .gpg 扩展名(所以 message.txt 会变成 message.txt.gpg)。

接下来,你输入 —recipient [email protected]。这指定了一个相应的 GPG 密钥的电子邮件,这个密钥实际上在这个系统上还不存在。

有点迷惑?

工作原理是,你在这里指定的电子邮件必须与你本地系统中的公钥相联系。

通常情况下,这将是来自另外一个人的 GPG 公钥,你要用它来加密你的文件。之后,该文件将只能用该用户的私钥进行解密。

在这个例子中,我将使用我以前的与 [email protected] 关联的 GPG 密钥。因此,其逻辑是,我用 [email protected]公钥 对文件进行加密,然后只能用 [email protected]私钥 进行解密。

如果你是为别人加密文件,你只有该公钥,但由于你是为自己加密文件,你的系统上有这两个密钥。

最后,你只需指定你要加密的文件。在这个例子中,让我们使用一个名为 message.txt 的文件,内容如下:

We're encrypting with GPG!

文本文件样本

同样地,如果电子邮件是 [email protected],新的 GPG 命令将如下所示:

gpg --encrypt --output message.txt.gpg --recipient [email protected] message.txt

用 GPG 加密文件

如果你尝试阅读该文件,你会看到它看起来像乱码。这是预料之中的,因为该文件现在已经被加密了。

读取加密文件会产生乱码

现在让我们删除未加密的 message.txt 文件,这样你就可以看到 message.txt.gpg 文件实际上在没有原始文件的情况下也能正常解密。

第四步:用 GPG 解密加密的文件

最后,让我们来实际解密加密的信息。你可以用下面的命令来做。

gpg --decrypt --output file file.gpg

通过这里的参数,我们首先指定 —decrypt,它告诉 GPG 你将会解密一个文件。

接下来,你输入 —output 文件,这只是告诉 GPG,在你解密后,你将把我们文件的解密形式保存到哪个文件。

最后,你输入 file.gpg,这是你的加密文件的路径。

按照这个例子,我使用的命令是这样的。

gpg --decrypt --output message.txt message.txt.gpg

用GPG解密文件

然后就完成了!当你想用 GPG 加密和解密文件时,这就是全部内容了。

剩下你可能想知道的是如何与他人分享你的公钥,以便他们在将文件发送给你之前对其进行加密。

发送和接收 GPG 密钥

要给别人发送一个 GPG 密钥,你首先需要从你的钥匙链中导出它,它包含了你所有的公钥和私钥。

要导出一个密钥,只需在你的钥匙链中找到密钥的 ID,然后运行以下命令,用密钥的 ID 替换 id,用你想保存的文件名替换 key.gpg

gpg --output key.gpg --export id

导出 GPG 公钥

要导入一个密钥,只需把输出文件(来自前面的命令)给其他用户,然后让他们运行下面的命令。

gpg --import key.gpg

但要正常使用该密钥,你需要验证该密钥,以便 GPG 正确地信任它。

这可以通过在其他用户的系统上使用 --edit-key 参数来完成,然后对密钥进行签名。

首先运行 gpg --edit-key id

GPG 编辑密钥

接下来,使用 —fpr 参数,它将显示密钥的指纹。这个命令的输出应该与你自己机器上的输出进行验证,这可以通过在你的系统上运行同样的 --edit-key 参数来找到。

GPG 密钥的指纹

如果一切吻合,只需使用 —sign 参数,一切就可以开始了。

签署 GPG 密钥

就是这样!其他用户现在可以开始用你的公钥加密文件了,就像你之前做的那样,这可以确保它们只有在你用你的私钥解密时才能被你读取。

这就是使用 GPG 的所有基础知识!

总结

现在你已经了解了开始使用 GPG 所需要的一切,包括为自己和他人加密文件。正如我前面提到的,这只是为了了解 GPG 的加密和解密过程是如何工作的。你刚刚获得的基本 GPG 知识在应用于真实世界的场景中时可以更上一层楼。

还需要一些帮助来弄清楚一些东西,或者有一些不工作的东西?欢迎在下面的评论中留下任何内容。


via: https://itsfoss.com/gpg-encrypt-files-basic/

作者:Hunter Wittenborn 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

用 GPG 和 Python 的 getpass 模块给你的密码多一层安全保障。

 title=

密码对程序员来说尤其重要。你不应该在不加密的情况下存储它们,而且你也不应该在用户输入密码的时候显示出输入的内容。当我决定要提高我的笔记本电脑的安全性时,这对我来说变得特别重要。我对我的家目录进行了加密,但当我登录后,任何以纯文本形式存储在配置文件中的密码都有可能暴露在偷窥者面前。

具体来说,我使用一个名为 Mutt 的应用作为我的电子邮件客户端。它可以让我在我的 Linux 终端中阅读和撰写电子邮件,但通常它希望在其配置文件中有一个密码。我限制了我的 Mutt 配置文件的权限,以便只有我可以看到它,我是我的笔记本电脑的唯一用户,所以我并不真的担心经过认证的用户会无意中看到我的配置文件。相反,我想保护自己,无论是为了吹嘘还是为了版本控制,不至于心不在焉地把我的配置发布到网上,把我的密码暴露了。此外,虽然我不希望我的系统上有不受欢迎的客人,但我确实想确保入侵者不能通过对我的配置上运行 cat 就获得我的密码。

Python GnuPG

Python 模块 python-gnupggpg 应用的一个 Python 封装。该模块的名字是 python-gnupg,你不要把它和一个叫做 gnupg 的模块混淆。

GnuPG(GPG) 是 Linux 的默认加密系统,我从 2009 年左右开始使用它。我对它很熟悉,对它的安全性有很高的信任。

我决定将我的密码输入 Mutt 的最好方法是将我的密码存储在一个加密的 GPG 文件中,创建一个提示我的 GPG 密码来解锁这个加密文件,然后将密码交给 Mutt(实际上是交给 offlineimap 命令,我用它来同步我的笔记本和电子邮件服务器)。

用 Python 获取用户输入 是非常容易的。对 input 进行调用,无论用户输入什么,都会被存储为一个变量:

print("Enter password: ")
myinput = input()

print("You entered: ", myinput)

我的问题是,当我根据密码提示在终端上输入密码时,我所输入的所有内容对任何从我肩膀上看过去或滚动我的终端历史的人来说都是可见的:

$ ./test.py
Enter password: my-Complex-Passphrase

用 getpass 输入不可见密码

正如通常的情况一样,有一个 Python 模块已经解决了我的问题。这个模块是 getpass4,从用户的角度来看,它的行为和 input 完全一样,只是不显示用户输入的内容。

你可以用 pip 安装这两个模块:

$ python -m pip install --user python-gnupg getpass4

下面是我的 Python 脚本,用于创建密码提示:

#!/usr/bin/env python
# by Seth Kenlon
# GPLv3

# install deps:
# python3 -m pip install --user python-gnupg getpass4

import gnupg
import getpass
from pathlib import Path

def get_api_pass():
  homedir = str(Path.home())
  gpg = gnupg.GPG(gnupghome=os.path.join(homedir,".gnupg"), use_agent=True)
  passwd = getpass.getpass(prompt="Enter your GnuPG password: ", stream=None)

  with open(os.path.join(homedir,'.mutt','pass.gpg'), 'rb') as f:
    apipass = (gpg.decrypt_file(f, passphrase=passwd))

  f.close()

  return str(apipass)
 
if __name__ == "__main__":
  apipass = get_api_pass()
  print(apipass)

如果你想试试,把文件保存为 password_prompt.py。如果你使用 offlineimap 并想在你自己的密码输入中使用这个方案,那么把它保存到某个你可以在 .offlineimaprc 文件中指向 offlineimap 的位置(我使用 ~/.mutt/password_prompt.py)。

测试密码提示

要查看脚本的运行情况,你首先必须创建一个加密文件(我假设你已经设置了 GPG):

$ echo "hello world" > pass
$ gpg --encrypt pass
$ mv pass.gpg ~/.mutt/pass.gpg
$ rm pass

现在运行 Python 脚本:

$ python ~/.mutt/password_prompt.py
Enter your GPG password:
hello world

当你输入时没有任何显示,但只要你正确输入 GPG 口令,你就会看到该测试信息。

将密码提示符与 offlineimap 整合起来

我需要将我的新提示与 offlineimap 命令结合起来。我为这个脚本选择了 Python,因为我知道 offlineimap 可以对 Python 程序进行调用。如果你是一个 offlineimap 用户,你会明白唯一需要的“整合”是在你的 .offlineimaprc 文件中改变两行。

首先,添加一行引用 Python 文件的内容:

pythonfile = ~/.mutt/password_prompt.py

然后将 .offlineimaprc中的 remotepasseval 行改为调用 password_prompt.py中的 get_api_pass() 函数:

remotepasseval = get_api_pass()

配置文件中不再有密码!

安全问题

在你的个人电脑上考虑安全问题有时会让人觉得很偏执。你的 SSH 配置是否真的需要限制为 600?隐藏在名为 .mutt 的无关紧要的电子邮件密码真的重要吗?也许不重要。

然而,知道我没有把敏感数据悄悄地藏在我的配置文件里,使我更容易把文件提交到公共 Git 仓库,把片段复制和粘贴到支持论坛,并以真实好用的配置文件的形式分享我的知识。仅就这一点而言,安全性的提高使我的生活更加轻松。而且有这么多好的 Python 模块可以提供帮助,这很容易实现。


via: https://opensource.com/article/21/7/invisible-passwords-python

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本系列文章中,我们将深度探讨如何使用 PGP 以及为工作于自由软件项目的开发者提供实用指南。在前一篇文章中,我们介绍了基本工具和概念。在本文中,我们将展示如何生成和保护你的 PGP 主密钥。

清单

  1. 生成一个 4096 位的 RSA 主密钥 (必要)
  2. 使用 paperkey 备份你的 RSA 主密钥 (必要)
  3. 添加所有相关的身份 (必要)

考虑事项

理解“主”(认证)密钥

在本节和下一节中,我们将讨论“主密钥”和“子密钥”。理解以下内容很重要:

  1. 在“主密钥”和“子密钥”之间没有技术上的区别。
  2. 在创建时,我们赋予每个密钥特定的能力来分配功能限制。
  3. 一个 PGP 密钥有四项能力

    • [S] 密钥可以用于签名
    • [E] 密钥可以用于加密
    • [A] 密钥可以用于身份认证
    • [C] 密钥可以用于认证其他密钥
  4. 一个密钥可能有多种能力

带有 [C] (认证)能力的密钥被认为是“主”密钥,因为它是唯一可以用来表明与其他密钥关系的密钥。只有 [C] 密钥可以被用于:

  • 添加或撤销其他密钥(子密钥)的 S/E/A 能力
  • 添加、更改或撤销密钥关联的身份(uid)
  • 添加或更改本身或其他子密钥的到期时间
  • 为了网络信任目的为其它密钥签名

在自由软件的世界里,[C] 密钥就是你的数字身份。一旦你创建该密钥,你应该格外小心地保护它并且防止它落入坏人的手中。

在你创建主密钥前

在你创建的你的主密钥前,你需要选择你的主要身份和主密码。

主要身份

身份使用邮件中发件人一栏相同格式的字符串:

Alice Engineer <[email protected]>

你可以在任何时候创建新的身份,取消旧的,并且更改你的“主要”身份。由于主要身份在所有 GnuPG 操作中都展示,你应该选择正式的和最有可能用于 PGP 保护通信的名字和邮件地址,比如你的工作地址或者用于在项目 提交 commit 时签名的地址。

密码

密码 passphrase 专用于私钥存储在磁盘上时使用对称加密算法对其进行加密。如果你的 .gnupg 目录的内容被泄露,那么一个好的密码就是小偷能够在线假冒你的最后一道防线,这就是为什么设置一个好的密码很重要的原因。

一个强密码最好使用丰富或混合的词典的 3-4 个词,而不引用自流行来源(歌曲、书籍、口号)。由于你将相当频繁地使用该密码,所以它应当易于输入和记忆。

算法和密钥强度

尽管现在 GnuPG 已经支持椭圆曲线加密一段时间了,但我们仍坚持使用 RSA 密钥,至少较长一段时间会这样。虽然现在就可以开始使用 ED25519 密钥,但你可能会碰到无法正确处理它们的工具和硬件设备。

在后续的指南中我们说 2048 位的密钥对 RSA 公钥加密的生命周期已经足够,你可能也会好奇主密钥为什么是 4096 位。 原因很大程度是由于社会因素而非技术上的:主密钥在密钥链上是最显眼的,如果你的主密钥位数比一些和你交互的开发者的少,他们肯定会鄙视你。

生成主密钥

为了生成你的主密钥,请使用以下命令,并且将 “Alice Engineer” 替换为正确值。

$ gpg --quick-generate-key 'Alice Engineer <[email protected]>' rsa4096 cert

这将弹出一个要求输入密码的对话框。然后,你可能需要移动鼠标或随便按一些键才能生成足够的熵,直到该命令完成。

查看命令输出,它就像这样:

pub rsa4096 2017-12-06 [C] [expires: 2019-12-06]
 111122223333444455556666AAAABBBBCCCCDDDD
uid Alice Engineer <[email protected]>

注意第二行的长字符串 —— 它是你新生成的密钥的完整指纹。密钥 ID(Key ID)可以用以下三种不同形式表达:

  • 指纹 Fingerprint ,一个完整的 40 个字符的密钥标识符
  • 长密钥 ID Long ,指纹的最后 16 个字符(AAAABBBBCCCCDDDD)
  • 短密钥 ID Short ,指纹的最后 8 个字符(CCCCDDDD)

你应该避免使用 8 个字符的短密钥 ID,因为它们不足够唯一。

这里,我建议你打开一个文本编辑器,复制你新密钥的指纹并粘贴。你需要在接下来几步中用到它,所以将它放在旁边会很方便。

备份你的主密钥

出于灾后恢复的目的 —— 同时特别的如果你试图使用 Web of Trust 并且收集来自其他项目开发者的密钥签名 —— 你应该创建你的私钥的硬拷贝备份。万一所有其它的备份机制都失败了,这应当是最后的补救措施。

创建一个你的私钥的可打印的硬拷贝的最好方法是使用为此而写的软件 paperkeypaperkey 在所有 Linux 发行版上可用,在 Mac 上也可以通过 brew 安装 paperkey

运行以下命令,用你密钥的完整指纹替换 [fpr]

$ gpg --export-secret-key [fpr] | paperkey -o /tmp/key-backup.txt

输出将采用易于 OCR 或手动输入的格式,以防如果你需要恢复它的话。打印出该文件,然后拿支笔,并在纸的边缘写下密钥的密码。这是必要的一步,因为密钥输出仍然使用密码加密,并且如果你更改了密钥的密码,你不会记得第一次创建的密钥是什么 —— 我保证。

将打印结果和手写密码放入信封中,并存放在一个安全且保护好的地方,最好远离你家,例如银行保险库。

打印机注意事项 打印机连接到计算机的并行端口的时代已经过去了。现在他们拥有完整的操作系统,硬盘驱动器和云集成。由于我们发送给打印机的关键内容将使用密码进行加密,因此这是一项相当安全的操作,但请使用您最好的偏执判断。

添加相关身份

如果你有多个相关的邮件地址(个人、工作、开源项目等),你应该将其添加到主密钥中。你不需要为任何你不希望用于 PGP 的地址(例如,可能不是你的校友地址)这样做。

该命令是(用你完整的密钥指纹替换 [fpr]):

$ gpg --quick-add-uid [fpr] 'Alice Engineer <[email protected]>'

你可以查看你已经使用的 UID:

$ gpg --list-key [fpr] | grep ^uid

选择主 UID

GnuPG 将会把你最近添加的 UID 作为你的主 UID,如果这与你想的不同,你应该改回来:

$ gpg --quick-set-primary-uid [fpr] 'Alice Engineer <[email protected]>'

下次,我们将介绍如何生成 PGP 子密钥,它是你实际用于日常工作的密钥。

通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。


via: https://www.linux.com/blog/learn/PGP/2018/2/protecting-code-integrity-pgp-part-2-generating-and-protecting-your-master-pgp-key

作者:KONSTANTIN RYABITSEV 译者:kimii 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在本系列文章中,我们将深度探讨如何使用 PGP 确保软件完整性。这些文章将为工作于自由软件项目的开发者提供实用指南,并且将包含以下主题:

  1. PGP 基础和最佳实践
  2. 如何用 Git 使用 PGP
  3. 如何保护你的开发者账户

我们使用与“Freedom”含义相同的词项 “Free”,但这个系列中列出的指南也可以被任何其它类型的依赖于分布式团队开发者贡献的软件中。如果你编写进入公共源仓库的代码,你可以从了解和遵循这篇指南中受益。

结构

每节分为两个部分:

  • 适用于你项目需求的清单
  • 形式自由的考虑事项的列表,解释这些决定取决于什么,并伴随着配置指令

清单优先级

每个清单中各项包含着优先级,用来帮助指导你的决定:

  • (必要)该项一定要排在考虑事项列表的前面。如果没有这样做,它们将给提交到开源项目中的代码带来高风险。
  • (推荐)包含该项将提升整体安全性,但会影响你与工作环境的交互方式,并且可能需要学习新的习惯或者放弃旧的习惯。

记住,这些只是指导。如果你感到这些优先级不能反映你项目提交的安全,你应该根据自己的需要调整它们。

PGP 基本概念和工具

清单

  1. 理解 PGP 在自由软件开发中的作用 (必要)
  2. 理解 公钥密码学 Public Key Cryptography 的基础知识 (必要)
  3. 理解 PGP 加密和签名的不同 (必要)
  4. 理解 PGP 密钥身份 key identities (必要)
  5. 理解 PGP 密钥有效性 key validity (必要)
  6. 安装 GnuPG 工具(版本 2.x) (必要)

考虑事项

自由软件社区长期依赖于 PGP 确保它生产的软件产品的真实性和完整性。你可能没有注意到,但无论你是一个 Linux 、Mac 和 Windowas 用户,你都曾依赖 PGP 来确保你电脑环境的完整性:

  • Linux 发行版依赖 PGP 来确保当二进制或者原代码包从被生产出来到被终端用户安装之间没被更改过
  • 自由软件项目通常会伴随发行软件的存档提供分离的 PGP 签名,使得下游的项目可以在把下载的版本集成到自己的分布式下载之前,验证下载版本的完整性。
  • 自由软件项目通常依赖代码本身的 PGP 签名来跟踪起源,并验证项目开发者提交的代码的完整性

这与工作于专有平台的程序员使用的开发者证书或代码签名机制非常相似。实际上,这两种技术背后的核心概念非常相似 —— 尽管它们在实现的技术层面和它们委托信任方式的大多不同。PGP 不依赖于集中式认证机构,而是让每个用户为每个证书赋予自己的信任。

我们的目标是使你的项目通过使用 PGP 来进行代码起源和完整性追踪,遵循最佳实践并遵守基本的安全预防措施。

极其基本的 PGP 操作概括

你不需要知道 PGP 如何工作的具体细节 —— 理解核心概念足以成功地达到我们的目的。PGP 依赖于公钥密码学来将明文转换为密文。这个过程需要两种不同的密钥:

  • 公钥,被所有人知道
  • 私钥,只被拥有者知道
加密

对加密来说,PGP 使用拥有者的公钥创造一条只能通过拥有者私钥解密的消息:

  1. 发送者生成一个随机的加密密钥(“会话密钥”)
  2. 发送者使用该会话密钥(使用对称算法)加密内容
  3. 发送者使用接收者的 PGP 公钥加密会话密钥
  4. 发送者向接收者发送加密后的内容和加密后的会话密钥

要解密:

  1. 接收者使用他们的 PGP 私钥解密会话密钥
  2. 接收者使用会话密钥解密消息的内容
签名

为了创建签名,PGP 私钥或公钥会以相反的方式使用:

  1. 签名者生成内容的校检和哈希
  2. 签名者使用自己的 PGP 私钥来加密该校检和
  3. 签名者伴随内容提供加密后的校检和

要验证签名:

  1. 验证者生成自己的内容校检和哈希
  2. 验证者使用签名者的 PGP 公钥来解密提供的校检和
  3. 如果校检和匹配,就验证了内容的完整性
结合使用

通常,加密消息也被发送者自己的 PGP 密钥签名。无论何时使用加密消息,这应当是默认的,因为没有认证的加密没有很大意义(除非你是一个告密者或秘密代理并且需要可行的可否认性)

理解密钥身份

每个 PGP 密钥必须有一个或多个与之关联的身份。通常,“ 身份 Identity ”指的是以下格式中的人物全名和邮件地址:

Alice Engineer <[email protected]>

有时也会在括号中包含说明,来告诉终端用户关于该特定密钥的更多信息:

Bob Designer (obsolete 1024-bit key) <[email protected]>

由于人们可以和多个职业和个人实体相关联,因此在同一密钥上可以有多个身份:

Alice Engineer <[email protected]>
Alice Engineer <[email protected]>
Alice Engineer <[email protected]>

当使用多个身份时,其中之一将被标记为“ primary identity 主要身份 ”来让检索更简单。

理解密钥有效性

为了能使用其他人的公钥来加密或验证,你需要确保它确实属于正确的人(Alice)而不属于冒牌的(Eve)。在 PGP 中,这被称为“密钥有效性”:

  • 有效性: 完全 full -- 意味着非常确认该密钥属于 Alice
  • 有效性: 临界 marginal -- 意味着大致确认该密钥属于 Alice
  • 有效性: 未知 unknown -- 意味着不确认该密钥是否属于 Alice

Web of Trust (WOT) 与 Trust on First Use (TOFU)

PGP 使用了一种信任委托机制叫“Web of Trust”。它的核心是尝试替代 HTTPS/TLS 世界中对集中式认证机构的需求。PGP 把这个责任交给了每个用户,而不是各种软件开发商来决定谁应该是你的可信认证实体。

不幸的是,很少有人理解 Web of Trust 的是如何工作的,能使用它的人更少。它仍然是 OpenPGP 规范的一个重要方面,但 GnuPG 的近期版本(2.2 及以上)已经实现了一种替代机制叫“Trust on First Use”(TOFU)。

你可以把 TOFU 当作类似 SSH 的信任方式。使用 SSH,当你第一次连接到远程系统,它的密钥指纹会被记录和保存。如果将来密钥改变,SSH 客户端将会提醒你并拒绝连接,迫使你决定是否信任已改变的的密钥。

同样,当你第一次导入某人的 PGP 密钥,它被假定可信。如果在将来的任何时候,GnuPG 碰巧发现另一同样身份的密钥,过去导入的密钥和新密钥都将被标记为无效,并且你需要手动指出保留哪个。

安装 OpenPGP 软件

首先,理解 PGP、OpenPGP、GnuPG 和 gpg 之间的不同很重要:

  • PGP (“Pretty Good Privacy”) 是最初商业软件的名字
  • OpenPGP 是与最初 PGP 工具兼容的 IETF 标准
  • GnuPG (“Gnu Privacy Guard”)是实现了 OpenPGP 标准的自由软件
  • GnuPG 的命令行工具称为 “gpg”

今天,“PGP”这个词几乎被普遍用来表示开放的 OpenPGP 标准,而不是最初的商业软件,因此“PGP”和“OpenPGP”是可以互换的。“GnuPG”和“pgp”这两个词应该仅在提及工具时使用,而不用于它们产生的输出或它们实现的 OpenPGP 功能。举例:

  • PGP(而非 GnuPG 或 GPG)密钥
  • PGP(而非 GnuPG 或 GPG)签名
  • PGP(而非 GnuPG 或 GPG)密钥服务器

理解这一点应该可以保护你免受来自你遇到的其他 PGP 用户“实际上”不可避免的迂腐。

安装 GnuPG

如果你正在使用 Linux,你应该已经安装过了 GnuPG。在 Mac 上,你应该安装 GPG-Suite,或者使用 brew 安装 gnupg2。在 Windows 上,你应该安装 GPG4Win,并且为了可以工作,你可能需要调整指南中的部分命令,除非你设置了类似 Unix 的环境。对其他平台来说,你需要自行查找正确的地址来下载和安装 GnuPG。

GnuPG 1 vs. 2

GnuPG v.1 和 GnuPG v.2 都实现了同样的标准,但它们提供不兼容的库和命令行工具,所以许多发行版都带有了旧的版本 1 和最新的版本 2。你需要确保你总是使用 GnuPG v.2。

首先,运行:

$ gpg --version | head -n1

如果你看到 gpg (GnuPG) 1.4.x,说明你正使用 GnuPG v.1。尝试下 gpg2 命令:

$ gpg2 --version | head -n1

如果你看到 gpg (GnuPG) 2.x.x,说明你可以继续了。这篇指南将假设你使用 GnuPG 2.2 版本(或更新)。如果你正使用 GnuPG 的 2.0 版本,本指南中某些命令可能无效,你应该考虑安装 GnuPG 最新的 2.2 版本

确保你总是使用 GnuPG v.2

如果你 gpggpg2 命令都有,你应该确保总是使用 GnuPG v.2,而不是旧的版本。你可以通过设置别名来确保这一点:

$ alias gpg=gpg2

你可以把它放在你的 .bashrc 中,以确保它在你使用 gpg 命令时总是被加载。

在本系列的第 2 部分中,我们将介绍生成和保护你的 PGP 主密钥的基本步骤。

通过 Linux 基金会和 edX 的免费“Introduction to Linux” 课程了解关于 Linux 的更多信息。


via: https://www.linux.com/blog/learn/2018/2/protecting-code-integrity-pgp-part-1-basic-pgp-concepts-and-tools

作者:Konstantin Ryabitsev 译者:kimii 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

目标:使用 GPG 加密文件

发行版:适用于任何发行版

要求:安装了 GPG 的 Linux 或者拥有 root 权限来安装它。

难度:简单

约定:

  • # - 需要使用 root 权限来执行指定命令,可以直接使用 root 用户来执行,也可以使用 sudo 命令
  • $ - 可以使用普通用户来执行指定命令

介绍

加密非常重要。它对于保护敏感信息来说是必不可少的。你的私人文件应该要被加密,而 GPG 提供了很好的解决方案。

安装 GPG

GPG 的使用非常广泛。你在几乎每个发行版的仓库中都能找到它。如果你还没有安装它,那现在就来安装一下吧。

Debian/Ubuntu

$ sudo apt install gnupg

Fedora

# dnf install gnupg2

Arch

# pacman -S gnupg

Gentoo

# emerge --ask app-crypt/gnupg

创建密钥

你需要一个密钥对来加解密文件。如果你为 SSH 已经生成过了密钥对,那么你可以直接使用它。如果没有,GPG 包含工具来生成密钥对。

$ gpg --full-generate-key

GPG 有一个命令行程序可以帮你一步一步的生成密钥。它还有一个简单得多的工具,但是这个工具不能让你设置密钥类型,密钥的长度以及过期时间,因此不推荐使用这个工具。

GPG 首先会询问你密钥的类型。没什么特别的话选择默认值就好。

下一步需要设置密钥长度。4096 是一个不错的选择。

之后,可以设置过期的日期。 如果希望密钥永不过期则设置为 0

然后,输入你的名称。

最后,输入电子邮件地址。

如果你需要的话,还能添加一个注释。

所有这些都完成后,GPG 会让你校验一下这些信息。

GPG 还会问你是否需要为密钥设置密码。这一步是可选的, 但是会增加保护的程度。若需要设置密码,则 GPG 会收集你的操作信息来增加密钥的健壮性。 所有这些都完成后, GPG 会显示密钥相关的信息。

加密的基本方法

现在你拥有了自己的密钥,加密文件非常简单。 使用下面的命令在 /tmp 目录中创建一个空白文本文件。

$ touch /tmp/test.txt

然后用 GPG 来加密它。这里 -e 标志告诉 GPG 你想要加密文件, -r 标志指定接收者。

$ gpg -e -r "Your Name" /tmp/test.txt

GPG 需要知道这个文件的接收者和发送者。由于这个文件给是你的,因此无需指定发送者,而接收者就是你自己。

解密的基本方法

你收到加密文件后,就需要对它进行解密。 你无需指定解密用的密钥。 这个信息被编码在文件中。 GPG 会尝试用其中的密钥进行解密。

$ gpg -d /tmp/test.txt.gpg

发送文件

假设你需要发送文件给别人。你需要有接收者的公钥。 具体怎么获得密钥由你自己决定。 你可以让他们直接把公钥发送给你, 也可以通过密钥服务器来获取。

收到对方公钥后,导入公钥到 GPG 中。

$ gpg --import yourfriends.key

这些公钥与你自己创建的密钥一样,自带了名称和电子邮件地址的信息。 记住,为了让别人能解密你的文件,别人也需要你的公钥。 因此导出公钥并将之发送出去。

gpg --export -a "Your Name" > your.key

现在可以开始加密要发送的文件了。它跟之前的步骤差不多, 只是需要指定你自己为发送人。

$ gpg -e -u "Your Name" -r "Their Name" /tmp/test.txt

结语

就这样了。GPG 还有一些高级选项, 不过你在 99% 的时间内都不会用到这些高级选项。 GPG 就是这么易于使用。你也可以使用创建的密钥对来发送和接受加密邮件,其步骤跟上面演示的差不多, 不过大多数的电子邮件客户端在拥有密钥的情况下会自动帮你做这个动作。


via: https://linuxconfig.org/how-to-encrypt-and-decrypt-individual-files-with-gpg

作者:Nick Congleton 译者:lujun9972 校对:wxy

本文由 LCTT 原创编译,Linux 中国 荣誉推出

Mutt 是一个 Linux/UNIX 终端环境下的开源的邮件客户端。Mutt 以及 Alpine 在 Linux 命令行爱好者中有着最忠诚的追随者,这不是没有原因的。想一下你所期待邮件客户端应有的功能,Mutt 拥有:多协议支持(例如,POP3、IMAP 和 SMTP),S/MIME 和 PGP/GPG 集成,会话线索,颜色标记,可定制宏/快捷键,等等。另外,基于命令行的 Mutt 相比粗重的基于浏览器的邮件客户端(如:Gmail,Ymail)或图形用户界面的邮件客户端(如:Thunderbird,MS Outlook)而言,是一个使用电子邮件的轻量级替代品。

当你想使用 Mutt 通过公司的 SMTP/IMAP 服务器访问或发送邮件,或取代网页邮件服务,可能所关心的一个问题是如何保护您的邮件凭据(如:SMTP/IMAP 密码),它们存储在一个纯文本 Mutt 配置文件(~/.muttrc)中。

对于这些人对安全的担忧,确实有一个容易的方法来加密 Mutt 配置文件*,以防止这种风险。在这个教程中,我描述了如何加密 Mutt 敏感配置,比如使用 GnuPG(GPG)加密 SMTP/IMAP 密码,GPG 是一个开源的 OpenPGP 实现。

第一步 (可选):创建 GPG 密钥

因为我们将要使用 GPG 加密 Mutt 配置文件,如果你没有 GPG 密钥,第一步就是创建一个(公钥/私钥对)。如果有,请忽略这步。

创建一个新 GPG 密钥,输入下面命令:

$ gpg --gen-key

选择密钥类型(RSA),密钥长度(2048 bits),和过期时间(0 代表不过期)。当出现用户 ID 提示时,输入关联到该公钥/私钥对的名字(Dan Nanni) 和邮箱地址([email protected])。最后,输入一个密码来保护你的私钥。

生成一个 GPG 密钥需要大量的随机字节来构成熵,所以在生成密钥期间确保在你的系统上执行一些随机行为(如:敲打键盘,移动鼠标或者读写磁盘)。根据密钥长度,生成 GPG 密钥要花几分钟或更多时间。

第二步:加密 Mutt 敏感配置

下一步,在 ~/.mutt 目录创建一个新的文本文件,然后把一些你想隐藏的 Mutt 敏感配置放进去。这个例子里,我指定了 SMTP/IMAP 密码。

$ mkdir ~/.mutt
$ vi ~/.mutt/password

set smtp_pass="XXXXXXX"
set imap_pass="XXXXXXX"

现在通过 GPG 使用你的公钥加密这个文件如下:

$ gpg -r [email protected] -e ~/.mutt/password

这将创建 ~/.mutt/password.gpg,这是一个原始文件的 GPG 加密版本。

然后删除 ~/.mutt/password,只保留 GPG 加密版本。

第三步:创建完整 Mutt 配置文件

现在你已经在一个单独的文件放置了加密的 Mutt 敏感配置,你可以在 ~/.muttrc 指定其余的 Mutt 配置。然后增加下面这行在 ~/.muttrc 末尾。

source "gpg -d ~/.mutt/password.gpg |"

当你启动 Mutt 时,这行将解密 ~/.mutt/password.gpg ,然后将解密内容应用到你的 Mutt 配置中。

下面展示一个完整 Mutt 配置例子,这可以让你通过 Mutt 访问 Gmail,而没有暴露你的 SMTP/IMAP 密码。用你的 Gmail ID 替代下面的 yourgmailaccount,此外你也需要在你的 Goolgle 账户设置中启用“支持不太安全的应用访问”。

set from = "[email protected]"
set realname = "Your Name"
set smtp_url = "smtp://[email protected]:587/"
set imap_user = "[email protected]"
set folder = "imaps://imap.gmail.com:993"
set spoolfile = "+INBOX"
set postponed = "+[Google Mail]/Drafts"
set trash = "+[Google Mail]/Trash"
set header_cache =~/.mutt/cache/headers
set message_cachedir =~/.mutt/cache/bodies
set certificate_file =~/.mutt/certificates
set move = no
set imap_keepalive = 900

# encrypted IMAP/SMTP passwords
source "gpg -d ~/.mutt/password.gpg |"

第四步(可选):配置 GPG 代理

这时候,你将可以使用加密了IMAP/SMTP 密码的 Mutt。然而,每次你运行 Mutt,你都要先被提示输入一个 GPG 密码来使用你的私钥解密 IMAP/SMTP 密码。

如果你想避免这样的 GPG 密码提示,你可以部署一个 gpg-agent。它以后台守护进程方式运行,gpg-agent 可以安全地缓存你的 GPG 密码,无需手工干预,gpg 可以自动从 gpg-agent 获得你的 GPG 密码。如果你正在使用 Linux 桌面,你可以配置使用一些等同于 gpg-agent 的特定的桌面软件,例如,GNOME 桌面的 gnome-keyring-daemon。

你可以在基于 Debian 系统安装 gpg-agent:

$ sudo apt-get install gpg-agent

gpg-agent 在基于 Red Hat 的系统上是预装好的。

现在增加下面这些到你的 .bashrc 文件中。

envfile="$HOME/.gnupg/gpg-agent.env"
if [[ -e "$envfile" ]] && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
    eval "$(cat "$envfile")"
else
    eval "$(gpg-agent --daemon --allow-preset-passphrase --write-env-file "$envfile")"
fi
export GPG_AGENT_INFO

重载 .bashrc,或简单的登出然后重新登录。

$ source ~/.bashrc

现在确认 GPGAGENTINFO 环境变量已经设置妥当。

$ echo $GPG_AGENT_INFO

/tmp/gpg-0SKJw8/S.gpg-agent:942:1

并且,当你输入 gpg-agent 命令时,你应该看到下面的信息。

$ gpg-agent

gpg-agent: gpg-agent running and available

一旦 gpg-agent 启动运行,它将会在第一次提示你输入密码时缓存你的 GPG 密码。随后你多次运行 Mutt ,都不会被提示要 GPG 密码(gpg-agent 一直开着,缓存就不会过期)。

结论

在这个指导里,我提供一个使用 GnuPG 加密如 SMTP/IMAP 密码这样的 Mutt 敏感配置的方法。注意,如果你想在 Mutt 上使用 GnuPG 来加密或签名你的邮件,你可以参考官方指南关于 GPG 与 Mutt 结合的部分。

如果你知道任何使用 Mutt 的安全技巧,欢迎分享它。


via: http://xmodulo.com/mutt-email-client-encrypted-passwords.html

作者:Dan Nanni 译者:wyangsun 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出