GnuPG，俗称 GPG，是一个非常通用的工具，被广泛用作电子邮件、信息、文件或任何你需要安全地发送给别人的东西的加密行业标准。学习使用 GPG 很容易，你可以在几分钟内就学会使用它。在本教程中，我将告诉你如何用 GPG 加密和解密文件。这是一个简单的教程，你可以在你的 Linux 系统上尝试所有的练习。这将帮助你练习 GPG 命令，并在你完全陌生的情况下理解它。请先阅读整个教程，然后开始自己做。GPG 是如何进行加密的？要使用 GPG，你首先需要有一个 GPG 密钥。GPG 密钥是你在后面的教程中用来加密（或解密）文件的东西。它也是用来识别你的身份的，你的名字和电子邮件也会与密钥绑定。GPG 密钥的工作原理是使用两个文件，一个私钥和一个公钥。这两个密钥是相互联系的，并且 GPG 的所有功能都需要使用它们，特别是对文件加密和解密。当你用 GPG 加密一个文件时，它使用的是私钥。然后，这个新的加密文件只能用配对的公钥进行解密。私钥，顾名思义，是以私下的、不给任何人看的方式来存储的密钥。另一方面，公钥是用来给其他人的，或者你希望能够解密你的文件的任何人。这就是 GPG 的加密方法的主要作用。它允许你对文件进行本地加密，然后允许其他人确保他们收到的文件实际上是由你发送的。因为他们能够解密文件的唯一方法是使用你的公钥，而这只有在文件首先使用你的私钥加密的情况下才有效。反之，其他人可以用你的公钥对文件进行加密，而唯一能够解密的方法是用你的私钥。因此，允许其他人公开发布文件，而不用担心除了你以外的人能够阅读它们。（LCTT 译注：另外一个常见的用例是你用你的私钥对公开发布的文件进行签名，别人使用你的公钥通过验证你的签名而确信文件是你发布的、并没有被篡改。但本文没有涉及这个用例。）换句话说，如果一个文件是用私钥加密的，它只能用相应的公钥解密。而如果一个文件是用公钥加密的，它只能用相应的私钥解密。你已经在使用 GPG 而没有意识到一个最常见的使用 GPG 的例子是在 Linux 软件包管理器中，特别是 外部仓库。你把开发者的公钥添加到你系统的可信密钥中。开发者用他/她的私钥签署软件包（生成签名）。由于你的 Linux 系统拥有该公钥文件，它就能理解该软件包实际上是来自受信任的开发者。许多加密服务在你没有意识到的情况下使用了某种 GPG 的实现。但现在最好不要去研究这些细节。现在你对这个概念有点熟悉了，让我们看看如何使用 GPG 来加密一个文件，然后用它来解密。用 GPG 对文件进行加密和解密这是一个非常简单的场景。我假定你只有一个系统，你想看看 GPG 是如何工作的。你并没有把文件发送到其他系统。你对文件进行加密，然后在同一个系统上解密。当然，这不是一个实际的用例，但这也不是本教程的目的。我的目的是让你熟悉 GPG 命令和功能。之后，你可以在现实世界中使用这些知识（如果需要的话）。为此，我将告诉你如何与他人分享你的公钥。第一步：安装 GPGGPG 可以在大多数发行版的软件库中找到，开箱即用。在基于 Debian 和 Ubuntu 的系统中，安装 gpg 包：sudo apt install gpg 如果你使用 基于 Arch 的发行版，用 pacman 命令 安装 gnupg 软件包：sudo pacman -S gnupg 第二步：生成一个 GPG 密钥在你的系统上生成一个 GPG 密钥只需要一条简单的命令。只要运行下面的命令，就会生成你的密钥（你可以对大多数问题使用默认值，如下面的下划线部分所示）。gpg --full-generate-key 检查 GPG 密钥然后你可以通过使用 --list-secret-keys 和 --list-public-keys 参数，分别看到私钥和公钥都是通过 pub 下显示的那个 ID 相互绑定的。第三步：用 GPG 加密一个文件现在你已经设置了 GPG 密钥，你可以开始对我们的文件进行加密了。使用下面的命令来加密文件：gpg --encrypt --output file.gpg --recipient user@example.com file 让我们快速浏览一下该命令的内容：首先，你指定了 —encrypt 选项。这告诉 GPG，我们将对一个文件进行加密。接下来，你指定了 --output file.gpg。这可以是任何名字，不过惯例是给你要加密的文件的名称加上 .gpg 扩展名（所以 message.txt 会变成 message.txt.gpg）。接下来，你输入 —recipient user@example.com。这指定了一个相应的 GPG 密钥的电子邮件，这个密钥实际上在这个系统上还不存在。有点迷惑？工作原理是，你在这里指定的电子邮件必须与你本地系统中的公钥相联系。通常情况下，这将是来自另外一个人的 GPG 公钥，你要用它来加密你的文件。之后，该文件将只能用该用户的私钥进行解密。在这个例子中，我将使用我以前的与 user@example.com 关联的 GPG 密钥。因此，其逻辑是，我用 user@example.com 的 公钥 对文件进行加密，然后只能用 user@example.com 的 私钥 进行解密。如果你是为别人加密文件，你只有该公钥，但由于你是为自己加密文件，你的系统上有这两个密钥。最后，你只需指定你要加密的文件。在这个例子中，让我们使用一个名为 message.txt 的文件，内容如下：We're encrypting with GPG! 同样地，如果电子邮件是 user@example.com，新的 GPG 命令将如下所示：gpg --encrypt --output message.txt.gpg --recipient user@example.com message.txt 如果你尝试阅读该文件，你会看到它看起来像乱码。这是预料之中的，因为该文件现在已经被加密了。现在让我们删除未加密的 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 密钥，你首先需要从你的钥匙链中导出它，它包含了你所有的公钥和私钥。要导出一个密钥，只需在你的钥匙链中找到密钥的 ID，然后运行以下命令，用密钥的 ID 替换 id，用你想保存的文件名替换 key.gpg。gpg --output key.gpg --export id 要导入一个密钥，只需把输出文件（来自前面的命令）给其他用户，然后让他们运行下面的命令。gpg --import key.gpg 但要正常使用该密钥，你需要验证该密钥，以便 GPG 正确地信任它。这可以通过在其他用户的系统上使用 --edit-key 参数来完成，然后对密钥进行签名。首先运行 gpg --edit-key id：接下来，使用 —fpr 参数，它将显示密钥的指纹。这个命令的输出应该与你自己机器上的输出进行验证，这可以通过在你的系统上运行同样的 --edit-key 参数来找到。如果一切吻合，只需使用 —sign 参数，一切就可以开始了。就是这样！其他用户现在可以开始用你的公钥加密文件了，就像你之前做的那样，这可以确保它们只有在你用你的私钥解密时才能被你读取。这就是使用 GPG 的所有基础知识！总结现在你已经了解了开始使用 GPG 所需要的一切，包括为自己和他人加密文件。正如我前面提到的，这只是为了了解 GPG 的加密和解密过程是如何工作的。你刚刚获得的基本 GPG 知识在应用于真实世界的场景中时可以更上一层楼。还需要一些帮助来弄清楚一些东西，或者有一些不工作的东西？欢迎在下面的评论中留下任何内容。via: https://itsfoss.com/gpg-encrypt-files-basic/作者：Hunter Wittenborn 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
用 GPG 和 Python 的 getpass 模块给你的密码多一层安全保障。密码对程序员来说尤其重要。你不应该在不加密的情况下存储它们，而且你也不应该在用户输入密码的时候显示出输入的内容。当我决定要提高我的笔记本电脑的安全性时，这对我来说变得特别重要。我对我的家目录进行了加密，但当我登录后，任何以纯文本形式存储在配置文件中的密码都有可能暴露在偷窥者面前。具体来说，我使用一个名为 Mutt 的应用作为我的电子邮件客户端。它可以让我在我的 Linux 终端中阅读和撰写电子邮件，但通常它希望在其配置文件中有一个密码。我限制了我的 Mutt 配置文件的权限，以便只有我可以看到它，我是我的笔记本电脑的唯一用户，所以我并不真的担心经过认证的用户会无意中看到我的配置文件。相反，我想保护自己，无论是为了吹嘘还是为了版本控制，不至于心不在焉地把我的配置发布到网上，把我的密码暴露了。此外，虽然我不希望我的系统上有不受欢迎的客人，但我确实想确保入侵者不能通过对我的配置上运行 cat 就获得我的密码。Python GnuPGPython 模块 python-gnupg 是 gpg 应用的一个 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 以及为工作于自由软件项目的开发者提供实用指南。在前一篇文章中，我们介绍了基本工具和概念。在本文中，我们将展示如何生成和保护你的 PGP 主密钥。清单生成一个 4096 位的 RSA 主密钥 （必要）使用 paperkey 备份你的 RSA 主密钥 （必要）添加所有相关的身份 （必要）考虑事项理解“主”（认证）密钥在本节和下一节中，我们将讨论“主密钥”和“子密钥”。理解以下内容很重要：在“主密钥”和“子密钥”之间没有技术上的区别。在创建时，我们赋予每个密钥特定的能力来分配功能限制。一个 PGP 密钥有四项能力[S] 密钥可以用于签名[E] 密钥可以用于加密[A] 密钥可以用于身份认证[C] 密钥可以用于认证其他密钥一个密钥可能有多种能力带有 [C] （认证）能力的密钥被认为是“主”密钥，因为它是唯一可以用来表明与其他密钥关系的密钥。只有 [C] 密钥可以被用于：添加或撤销其他密钥（子密钥）的 S/E/A 能力添加、更改或撤销密钥关联的身份（uid）添加或更改本身或其他子密钥的到期时间为了网络信任目的为其它密钥签名在自由软件的世界里，[C] 密钥就是你的数字身份。一旦你创建该密钥，你应该格外小心地保护它并且防止它落入坏人的手中。在你创建主密钥前在你创建的你的主密钥前，你需要选择你的主要身份和主密码。主要身份身份使用邮件中发件人一栏相同格式的字符串：Alice Engineer <alice.engineer@example.org> 你可以在任何时候创建新的身份，取消旧的，并且更改你的“主要”身份。由于主要身份在所有 GnuPG 操作中都展示，你应该选择正式的和最有可能用于 PGP 保护通信的名字和邮件地址，比如你的工作地址或者用于在项目 提交 commit 时签名的地址。密码 密码 passphrase 专用于私钥存储在磁盘上时使用对称加密算法对其进行加密。如果你的 .gnupg 目录的内容被泄露，那么一个好的密码就是小偷能够在线假冒你的最后一道防线，这就是为什么设置一个好的密码很重要的原因。一个强密码最好使用丰富或混合的词典的 3-4 个词，而不引用自流行来源（歌曲、书籍、口号）。由于你将相当频繁地使用该密码，所以它应当易于输入和记忆。算法和密钥强度尽管现在 GnuPG 已经支持椭圆曲线加密一段时间了，但我们仍坚持使用 RSA 密钥，至少较长一段时间会这样。虽然现在就可以开始使用 ED25519 密钥，但你可能会碰到无法正确处理它们的工具和硬件设备。在后续的指南中我们说 2048 位的密钥对 RSA 公钥加密的生命周期已经足够，你可能也会好奇主密钥为什么是 4096 位。 原因很大程度是由于社会因素而非技术上的：主密钥在密钥链上是最显眼的，如果你的主密钥位数比一些和你交互的开发者的少，他们肯定会鄙视你。生成主密钥为了生成你的主密钥，请使用以下命令，并且将 “Alice Engineer” 替换为正确值。$ gpg --quick-generate-key 'Alice Engineer <alice@example.org>' rsa4096 cert 这将弹出一个要求输入密码的对话框。然后，你可能需要移动鼠标或随便按一些键才能生成足够的熵，直到该命令完成。查看命令输出，它就像这样：pub rsa4096 2017-12-06 [C] [expires: 2019-12-06] 111122223333444455556666AAAABBBBCCCCDDDD uid Alice Engineer <alice@example.org> 注意第二行的长字符串 —— 它是你新生成的密钥的完整指纹。密钥 ID（Key ID）可以用以下三种不同形式表达： 指纹 Fingerprint ，一个完整的 40 个字符的密钥标识符 长密钥 ID Long ，指纹的最后 16 个字符（AAAABBBBCCCCDDDD） 短密钥 ID Short ，指纹的最后 8 个字符（CCCCDDDD）你应该避免使用 8 个字符的短密钥 ID，因为它们不足够唯一。这里，我建议你打开一个文本编辑器，复制你新密钥的指纹并粘贴。你需要在接下来几步中用到它，所以将它放在旁边会很方便。备份你的主密钥出于灾后恢复的目的 —— 同时特别的如果你试图使用 Web of Trust 并且收集来自其他项目开发者的密钥签名 —— 你应该创建你的私钥的硬拷贝备份。万一所有其它的备份机制都失败了，这应当是最后的补救措施。创建一个你的私钥的可打印的硬拷贝的最好方法是使用为此而写的软件 paperkey。paperkey 在所有 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 <allie@example.net>' 你可以查看你已经使用的 UID：$ gpg --list-key [fpr] | grep ^uid 选择主 UIDGnuPG 将会把你最近添加的 UID 作为你的主 UID，如果这与你想的不同，你应该改回来：$ gpg --quick-set-primary-uid [fpr] 'Alice Engineer <alice@example.org>' 下次，我们将介绍如何生成 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 保护代码完整性（一）： 基本概念和工具
在本系列文章中，我们将深度探讨如何使用 PGP 确保软件完整性。这些文章将为工作于自由软件项目的开发者提供实用指南，并且将包含以下主题：PGP 基础和最佳实践如何用 Git 使用 PGP如何保护你的开发者账户我们使用与“Freedom”含义相同的词项 “Free”，但这个系列中列出的指南也可以被任何其它类型的依赖于分布式团队开发者贡献的软件中。如果你编写进入公共源仓库的代码，你可以从了解和遵循这篇指南中受益。结构每节分为两个部分：适用于你项目需求的清单形式自由的考虑事项的列表，解释这些决定取决于什么，并伴随着配置指令清单优先级每个清单中各项包含着优先级，用来帮助指导你的决定：（必要）该项一定要排在考虑事项列表的前面。如果没有这样做，它们将给提交到开源项目中的代码带来高风险。（推荐）包含该项将提升整体安全性，但会影响你与工作环境的交互方式，并且可能需要学习新的习惯或者放弃旧的习惯。记住，这些只是指导。如果你感到这些优先级不能反映你项目提交的安全，你应该根据自己的需要调整它们。PGP 基本概念和工具清单理解 PGP 在自由软件开发中的作用 （必要）理解 公钥密码学 Public Key Cryptography 的基础知识 （必要）理解 PGP 加密和签名的不同 （必要）理解 PGP 密钥身份 key identities （必要）理解 PGP 密钥有效性 key validity （必要）安装 GnuPG 工具（版本 2.x） （必要）考虑事项自由软件社区长期依赖于 PGP 确保它生产的软件产品的真实性和完整性。你可能没有注意到，但无论你是一个 Linux 、Mac 和 Windowas 用户，你都曾依赖 PGP 来确保你电脑环境的完整性：Linux 发行版依赖 PGP 来确保当二进制或者原代码包从被生产出来到被终端用户安装之间没被更改过自由软件项目通常会伴随发行软件的存档提供分离的 PGP 签名，使得下游的项目可以在把下载的版本集成到自己的分布式下载之前，验证下载版本的完整性。自由软件项目通常依赖代码本身的 PGP 签名来跟踪起源，并验证项目开发者提交的代码的完整性这与工作于专有平台的程序员使用的开发者证书或代码签名机制非常相似。实际上，这两种技术背后的核心概念非常相似 —— 尽管它们在实现的技术层面和它们委托信任方式的大多不同。PGP 不依赖于集中式认证机构，而是让每个用户为每个证书赋予自己的信任。我们的目标是使你的项目通过使用 PGP 来进行代码起源和完整性追踪，遵循最佳实践并遵守基本的安全预防措施。极其基本的 PGP 操作概括你不需要知道 PGP 如何工作的具体细节 —— 理解核心概念足以成功地达到我们的目的。PGP 依赖于公钥密码学来将明文转换为密文。这个过程需要两种不同的密钥：公钥，被所有人知道私钥，只被拥有者知道加密对加密来说，PGP 使用拥有者的公钥创造一条只能通过拥有者私钥解密的消息：发送者生成一个随机的加密密钥（“会话密钥”）发送者使用该会话密钥（使用对称算法）加密内容发送者使用接收者的 PGP 公钥加密会话密钥发送者向接收者发送加密后的内容和加密后的会话密钥要解密：接收者使用他们的 PGP 私钥解密会话密钥接收者使用会话密钥解密消息的内容签名为了创建签名，PGP 私钥或公钥会以相反的方式使用：签名者生成内容的校检和哈希签名者使用自己的 PGP 私钥来加密该校检和签名者伴随内容提供加密后的校检和要验证签名：验证者生成自己的内容校检和哈希验证者使用签名者的 PGP 公钥来解密提供的校检和如果校检和匹配，就验证了内容的完整性结合使用通常，加密消息也被发送者自己的 PGP 密钥签名。无论何时使用加密消息，这应当是默认的，因为没有认证的加密没有很大意义（除非你是一个告密者或秘密代理并且需要可行的可否认性）理解密钥身份每个 PGP 密钥必须有一个或多个与之关联的身份。通常，“ 身份 Identity ”指的是以下格式中的人物全名和邮件地址：Alice Engineer <alice.engineer@example.com> 有时也会在括号中包含说明，来告诉终端用户关于该特定密钥的更多信息：Bob Designer (obsolete 1024-bit key) <bob.designer@example.com> 由于人们可以和多个职业和个人实体相关联，因此在同一密钥上可以有多个身份：Alice Engineer <alice.engineer@example.com> Alice Engineer <aengineer@personalmail.example.org> Alice Engineer <webmaster@girlswhocode.example.net> 当使用多个身份时，其中之一将被标记为“ primary identity 主要身份 ”来让检索更简单。理解密钥有效性为了能使用其他人的公钥来加密或验证，你需要确保它确实属于正确的人（Alice）而不属于冒牌的（Eve）。在 PGP 中，这被称为“密钥有效性”：有效性： 完全 full -- 意味着非常确认该密钥属于 Alice有效性： 临界 marginal -- 意味着大致确认该密钥属于 Alice有效性： 未知 unknown -- 意味着不确认该密钥是否属于 AliceWeb 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. 2GnuPG 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如果你 gpg 和 gpg2 命令都有，你应该确保总是使用 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 提供了很好的解决方案。安装 GPGGPG 的使用非常广泛。你在几乎每个发行版的仓库中都能找到它。如果你还没有安装它，那现在就来安装一下吧。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 邮件客户端中使用密文密码
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） 和邮箱地址（myemail@email.com）。最后，输入一个密码来保护你的私钥。生成一个 GPG 密钥需要大量的随机字节来构成熵，所以在生成密钥期间确保在你的系统上执行一些随机行为（如：敲打键盘，移动鼠标或者读写磁盘）。根据密钥长度，生成 GPG 密钥要花几分钟或更多时间。第二步：加密 Mutt 敏感配置下一步，在 ~/.mutt 目录创建一个新的文本文件，然后把一些你想隐藏的 Mutt 敏感配置放进去。这个例子里，我指定了 SMTP/IMAP 密码。$ mkdir ~/.mutt $ vi ~/.mutt/password set smtp_pass="XXXXXXX" set imap_pass="XXXXXXX" 现在通过 GPG 使用你的公钥加密这个文件如下：$ gpg -r myemail@email.com -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 = "yourgmailaccount@gmail.com" set realname = "Your Name" set smtp_url = "smtp://yourgmailaccount@smtp.gmail.com:587/" set imap_user = "yourgmailaccount@gmail.com" 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中国 荣誉推出
如果你一直在考虑如何加密电子邮件，那么在众多的邮件服务和邮件客户端中挑来挑去一定是件头痛的事情．可以考虑两种加密方法：SSL或TLS加密会保护发送到邮件服务器的登录名和密码．Gunpg是一款标准的、强大的Linux加密工具，可以加密和认证消息．如果你可以管理自己的GPG加密，并不考虑第三方工具，那它就够了，其它的我们将在稍后讨论．即便加密了消息，你仍然会暴露在流量分析中，因为消息头部必须是明文形式．所以需要另一款比如Tor network来隐藏你在互联网上的足迹．我们会看看各种邮件服务和客户端，以及其中的利弊．忘掉Web邮件如果你使用过GMail, Yahoo，Hotmail或者其它Web邮件提供商的邮件服务，那就忘掉它们吧．你在Web浏览器里输入的任何信息都会暴露在JavaScript攻击中，而且无论服务提供商提供什么保障都是过眼云烟(译者注:此说法靠谱否?)．GMail,Yahoo和Hotmail均提供SSL/TLS加密来防止消息被窃听．但是它们不会提供任何保护来阻碍它们自己的数据挖掘，因此并不会提供端到端的加密．Yahoo和Google都声称将在明年推出端到端的加密．对此我持怀疑态度，因为如果一旦它们的核心业务数据挖掘受到干预，它们就什么都干不了了．市面上也有各式各样的声称可以为所有类型的电子邮件都能提供安全加密的第三方邮件加密服务，比如Virtru和SafeMess．对此我依旧表示怀疑，因为无论是谁，只要持有加密秘钥就可以访问你的消息，所以你还是要依赖于对他们的信任而不是技术．对等消息可以避免许多使用集中化服务中的缺陷．RetroShare和Bitmessage是两种流行的范例．我不知道它们是否如实所述，但这么说肯定有其可取之处．那Anddroid和iOS又如何呢?假设大部分的Android和iOS应用都没有权限获取你的消息的话，那就是最安全的．不要照搬我说的 -- 在应用将要安装到你的设备上时麻烦读读相关的服务条款并检查所要求的权限．即便在初次安装时它们的条款是可接受的，也记得单方面的条款改变是行业的标准，所以做最坏的打算是最安全的．零知识（Zero Knowledge）Proton Mail是一款全新的邮件服务，声称采用零知识就可以实现消息加密．认证和消息加密分为两个单独的步骤，Proton遵照Swiss隐私条款，它们不会通过日志记录用户的活动．零知识加密提供真正的安全．这代表只有你拥有你的加密秘钥，如果你丢了它们，你的消息就无法恢复了．也有许多加密电子邮件服务声称可以保护你的隐私．认真阅读细则，查看红色标注的地方，比如受限的用户数据采集，与好友分享，与执法部门的合作等．这些条款暗示它们会收集和共享用户数据，拥有权限获取你的加密秘钥，并读取你的消息．Linux邮件客户端一款独立的开源邮件客户端，比如, Mutt, Claws, Evolution, Sylpheed和Alpine，可建立你自己控制的GnuPG秘钥，给你大部分的保护．（建立更安全的电子邮件和Web浏览的最容易的方式是运行TAILS live的Linux发行版．详情查看通过 Tor、TAILS 和 Debian 在网上保护你自己。）无论你使用的是TAILS还是一款标准Linux发行版，管理GnuPG的方法是相同的，所以下面来学习如何使用GnuPG加密消息．使用GnuPG首先，熟悉一下相关术语。OpenPGP是一种开放的电子邮件加密和认证协议，基于菲利普·齐默曼的Pretty Good Privacy (PGP)。GNU Privacy Guard (GnuPG or GPG)是OpenPGP的GPL实现。GnuPG使用对称公钥加密算法，也就是说会生成一对密钥：一个任何人都可以用来加密发送给你的消息的公钥和一个只有你自己拥有用来解密消息的的私钥。GnuPG执行两个分开的函数：数字化签名消息以证明消息来自你和加密消息。任何人都可以读到你的数字签名消息，但只有那些与你交换密钥的人才可以读取加密消息。切记千万不要与他人分享你的密钥！只能分享公钥。Seahorse是GnuPG对应的GNOME图形化前端，KGpg是KDE图形化的GnuPG工具。Kgpg为了创建了管理加密秘钥提供了一个很好的GUI界面．现在我们执行生成和管理GunPG密钥的基本步骤。这个命令生成一个新的密钥：$ gpg --gen-key 这个过程有许多步骤；对于大部分人来说，只需要回答所有的问题，遵循默认设置就好。当你生成你的密钥时，记下来并将其保存在一个安全的地方，因为如果你丢掉了它，你就不能解密任何消息了。任何关于不要写下密码的建议都是错误的。我们中的大部分人要记住许多登录名和密码，包括那些我们几乎从来不会用到的，所以全部记住它们是不现实的。你知道当人们不写下他们的密码时会发生什么吗？他们会选择生成简单的密码并不断重复使用。你存储在电脑里的任何东西都潜在地会被攻击窃取；一个保存在上锁的柜子里的小本是无法通过渗透获取的，除了物理的入侵，当然入侵者要知道如何去寻找它。我必须叮嘱你们去弄清楚如何使用新密钥去配置邮件客户端，因为每一个都不同。你可以按照如下操作列出你的密钥：$ gpg --list-keys /home/carla/.gnupg/pubring.gpg ------------------------------ pub 2048R/587DD0F5 2014-08-13 uid Carla Schroder (my gpg key) sub 2048R/AE05E1E4 2014-08-13 这能快速地获知像密钥的位置、名称（也就是UID）等必要信息。假设你想要把公钥上传到密钥服务器，可以参考实例操作：$ gpg --send-keys 'Carla Schroder' --keyserver http://example.com 当你生成了一个新的密钥要上传到公钥服务器，你也应该生成一个撤销证书。不要推迟到以后做———当你生成新密钥时就生成它。你可以给它取任意的名称，比如使用一个像mycodeproject.asc的描述性名称来代替revoke.asc：$ gpg --output revoke.asc --gen-revoke 'Carla Schroder' 如果你的密钥变得不可靠了，你可以通过向keyring导入撤销证书来撤销它：$ gpg --import ~/.gnupg/revoke.asc 然后生成并上传一个新的密钥来取代它。当它们更新到密钥数据库时，所有使用旧密钥的用户都会被通知。你必须像保护私钥一样保护撤销证书。将它拷贝到CD或USB存储器中，并加锁，然后从电脑中删除。这是明文密钥，所以你甚至可以将它打印出来。如果你需要一份复制粘贴的密钥，比如在允许将密钥粘贴到网页表格中的公用keyring中，或者是想将公钥发布到个人站点上，那么你必须生成一份公钥的ASCII-armored版本：$ gpg --output carla-pubkey.asc --export -a 'Carla Schroder' 这会生成可见的明文公钥，就像下面这个小例子：-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQENBFPrn4gBCADeEXKdrDOV3AFXL7QQQ+i61rMOZKwFTxlJlNbAVczpawkWRC3l IrWeeJiy2VyoMQ2ZXpBLDwGEjVQ5H7/UyjUsP8h2ufIJt01NO1pQJMwaOMcS5yTS [...] I+LNrbP23HEvgAdNSBWqa8MaZGUWBietQP7JsKjmE+ukalm8jY8mdWDyS4nMhZY= =QL65 -----END PGP PUBLIC KEY BLOCK----- 相信上面的教程应该使你学会如何使用GnuPG。如果不够，The GnuPG manuals上有使用GnuPG和相关全部配置的详细信息。via: http://www.linux.com/learn/tutorials/784165-how-to-encrypt-email-in-linux作者：Carla Schroder 译者：KayGuoWhu 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出
事实上，我的硬盘上不存在那种不愿意被别人看到的东西，只存有一些猫咪的照片、一些记录着想写的书的想法的文本文件，或者是一些短篇故事的文本，也有一些写了一半的 NaNoWriMo 小说文件。简单的说，我的硬盘就没有加密的必要，因为没有什么可隐藏的。可问题是，我们错误的把“隐私的渴望”跟“要隐藏某东西”两概念混淆在一起。比如说我生活的美国，我们视隐私权利是理所当然的事，但不包括那些传统所认为的“某人的隐藏色情或炸弹”。隐私考虑的是一些平常的事情。我居住在密歇根州。这儿的冬天很冷，我趋向于把温度设置在华氏 75 度左右。对您们来说这个温度可能高了，但在我的家里刚好合适。多亏我的家是属于私有的，我的邻居不可能知道我们保持了这么高的温度，否则一但他们看到冬天如此“浪费”能源的家庭，这些邻居心里会很不平衡的。事实上，本地条规中有一条明确指出任何超过华氏 60 度的就算是生态浪费。我并不想与这种僵老的条例较真，所以我仅仅想保守我们舒适的房子的秘密。我们并不想隐藏任何事情，但也并不是任何事情都要让外人知道。很明显，我举的例子有点弱智，但我希望的是这能引起大家的思考。现代的 Linux 系统很容易的就可以对我们的数据进行加密，并且很可靠，所以为什么不好好利用利用呢？加密原理?我不会涉及太多关于加密原理的细节，但要明白最基本的原理，即使是最简单的实现，这是必须的。要加密和解密一个文件，需要两把“钥匙”。一把是私钥，正如名字所示，属于私有的。我宁愿把私钥看作是真实的钥匙——你想要多少就可造出多少，但这样做是不明智的。同样的，私钥你造的越多，某些不怀好意的人得到其中一把的机率就越大，他们就会闯入你的公寓（额，我的意思是指那些文件）。公钥更像是锁的样子，只有你能（用你的私钥）打开此锁。这公钥任何人都可以得到，你可以将它张贴在网站上、把它放在你的 E-mail 中、甚至纹在你的背上。其它人想创建一个只有你能访问的文件，就可以使用此公钥来加密。这种一对多（LCTT译注：指别人可以加密多个文件，而只有你的一个私钥才能解密）的情况也有个很酷的副作用。如果你用你的私钥来加密一些东西，任何人都可以用你提供的公钥来解密它们。这听起来很傻，但这种情景很有用。虽然加密的文件不能免于被窥视，但是它能保证此文件确实来自于你而没有被恶意改动过。用你的公钥能解密的文件仅仅只能是用你私钥加密过的。用这种方式，用私钥加密的文件即是数字“签名”文件。（LCTT译注：既然是任何人都可以用公钥解密，其实加密没有意义，相反，仅仅用你的私钥做一个签名指纹，别人只需要用你的公钥来验证该签名是否一致即可判断是否来自你。）（LCTT译注：其实本文此处所述的加密解密、签名校验等原理不完全正确，和实际的非对称加密情形有所差异，不过比较容易理解和类比。）通用加密步骤:你有一个文件想要发送给苏茜 ，所以你得使用苏茜的公钥来加密，这样就只有 苏茜才能打开这个文件，但苏茜没有办法知道是谁给她发送的文件。因为任何一个人都可以用她的公钥来加密文件。因此，你得把你的文件用苏茜的公钥和你的私钥都加密。苏茜将不得不解密两次，但她知道它是来自于你的文件。（LCTT译注：实际上应该是用你的私钥要做签名，生成一小段签名指纹，而不是对已经加密的文件再次加密。）苏茜接收到此文件后会用能证明来自于你的公钥来解密第一层。（LCTT译注：校验签名，确认来自你的私钥的签名正确。）然后用她的私钥来解密第二层的密码，这是唯一的能够将原始文件进行解密的钥匙了（因为你是用她的公钥来加密的）。当然，这情景就是用来安全传输文件的加密手段。这也是加密你的文件（或者分区）相当常用及简单的方法。就让我们开始来对文件进行加密吧，因为大多数人都想加密他们的系统。始于简在深入更复杂的各种加密设置操作前，我们先做简单的对文件加密例子。能处理加密的应用程序有很多很多，事实上，对文件和系统进行加密的各种可用软件选择，很容易就会让我们变得焦头烂额。现在，我们就使用一款很基本的（但非常强大）命令行工具来对文件加密。 GPG （英文名：Gnu Privacy Guard）是一款对商业软件 PGP（英文名：Pretty Good Protection）的开源实现软件。它具有加密、签名及管理多个密钥等功能。用例子说明，让我们简单的加密一个文件吧。我们假设你有一个名叫 secret\_manifesto.txt 的文件，它包含有关于生命、宇宙及一切事物的秘密。使用 GPG，你只需要一个密码就可以加密此文件。使用密码远比使用公钥和私钥对简单，因为它只是用你的密码加密。虽然这比较容易让你的文件遭受到破解（比如使用彩虹表或其他黑客工具暴力破解），但像它的名字中所宣称的：这是相当不错的保护。要加密你的文件，可以这样做：# gpg -c secret_manifesto.txt Enter passphrase: Repeat passphrase: 一但完成，在相同的目录下就会多出个新的文件，它默认的名字是 secret\_manifesto.txt.gpg 。这是一个二进制文件，这意味着它真的比较小，但是要将其内容拷贝/粘贴到电子邮件（e-mail）或 即时消息（IM） 就不可能了（LCTT译注：当然你可以使用附件方式。）。要使其便于拷贝等操作，可以添加 -a 标志，这将创建一个只包含 ASCII 码文本的加密文件：# gpg -a -c secret_manifesto.txt Enter passphrase: Repeat passphrase: # ls -l -rw-rw-r-- 1 spowers spowers 6 Nov 23 1:26 secret_manifesto.txt -rw-rw-r-- 1 spowers spowers 174 Nov 23 1:27 secret_manifesto.txt.asc -rw-rw-r-- 1 spowers spowers 55 Nov 23 1:26 secret_manifesto.txt.gpg 注意到现在多了一个以 .asc 为扩展名的文件。它是个纯文本文件，从上面的代码段示例可以看到它比二进制的加密文件还大，当然比原文本文件就大的更多了。一但你把文件加密了，也确实想要对些信息保密，最明智的就是把原文本文件删除掉。（LCTT译注：千万记住密码啊，否则谁也帮不了你了——你得自己破解自己的密码啦:>）要解密文件，你需要再一次使用 GPG 程序。不管是二进制的还是 ASCII 文件，使用相同的命令就可以解密。如下所示：# gpg secret_manifesto.txt.asc gpg: CAST5 encrypted data Enter passphrase: gpg: encrypted with 1 passphrase File `secret_manifesto.txt' exists. Overwrite? (y/N) 注意到上面的例子中，我没有删除源文本文件，所以 GPG 给出了是否覆盖选项提示。一但操作完成，我的未加密的源文件又回来了。如果你仅仅只有一两个文件要保护，那基于命令行的 GPG 程序正是你所需的。但如果你想实现在系统上指定一个区域，任何保存到这区域的的文件都会自动加密的话，就有点复杂了。可这也并不是非常的困难，让我们用一个非常简单的示范例子来讲解吧。加密 USB 驱动盘如我前面提到的，要加密有很多可选的方式方法。加密磁盘分区最通用的一种方法是 LUKS（Linux Unified Key Setup） 系统。一个使用 LUKS 格式化分区的 USB 驱动盘可以被大多数系统自动识别到。实际上，如果你使用的是像 Ubuntu 桌面这样的桌面环境系统的话，加密 USB 驱动盘其实就是在格式化过程中简单的勾选上一个复选框而已。虽然这是加密 USB 盘最容易让人接受的方式，但我还是想演示如何在命令行下进行加密，因为这种方式可以让你明白在加密的后面具体发生了什么。步骤 1: 识别您的 USB 驱动盘。在您插入 USB 驱动盘后，如果在终端输入 dmesg 命令，将会显示出所有的系统信息，包括刚插入的 USB 驱动盘的设备名字。 确保设备标识是正确的，因为后面要进行的操作会破坏驱动盘上的所有数据。您也不想一不小心就格式化掉正常的磁盘吧。（虽然不用提醒，但我还是要说，确保您的 USB 驱动盘已经没有你想保留的数据，因为这是一个破坏性的过程。）步骤 2: 对 USB 驱动盘进行分区。假设，在您的系统上 USB 驱动盘是 /dev/sdb 这个设备，您需要在这个驱动上创建一个单分区（LCTT译注：设备是sdb，其上可以有多个分区，分别叫sdb1、sdb2等等）。我们使用 fdisk 命令。下面是 fdisk 必须的交互操作。一般地，用 o 命令来创建一个新的空分区，然后用 w 命令来保存设置。然后重新运行 fdisk 命令，并用 n 命令来创建一个新的主分区，接下来保持默认的以使用整个设备空间：# sudo fdisk /dev/sdb Command (m for help): o Building a new DOS disklabel with disk identifier 0x1234567. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Command (m for help): w The partition table has been altered! # sudo fdisk /dev/sdb Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4, default 1): 1 Using default value 1 First sector (2048-1016522, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-1016522, default 1016522): Using default value 1016522 Command (m for help): w The partition table has been altered! 现在你的 USB 驱动盘有了一个单分区了（/dev/sdb1），但还没有文件系统，这正是我们所想要的，因为 LUKS 系统需要在创建文件系统前在您的分区上创建一个加密层。因此，在创建文件系统之前，就让我们在分区上先创建一个 LUKS 层吧，可以使用 cryptsetup 程序。如果您还没有安装 cryptsetup 的话，可以搜索您系统发布版本的仓库源，里面就有。下面就开始创建 LUKS 加密分区层:# cryptsetup luksFormat /dev/sdb1 WARNING! ======== This will overwrite data on /dev/sdb1 irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: Verify passphrase: 按照提示的操作，一定要确保记得您的密码！注意，这儿的“密码单词”不仅仅只表示一个单词。这只是一个习惯，因而得名，设置的越长越复杂，越难被破解。一但上面的操作完成，就创建好了一个加密的分区，但它还没有被挂载或格式化。要做的第一步就是挂载分区，可以再一次使用 cryptsetup 工具：# cryptsetup luksOpen /dev/sdb1 my_crypto_disk Enter passphrase for /dev/sdb1: 当输入完密码后，您输入名字的设备就会像虚拟硬盘一样被挂载上。通常，它挂载在 /dev/mapper/设备名 的目录下，所以这个例子所示的分区就挂载到了 /dev/mapper/mycryptodisk 目录。现在这个设备就可当做未加密的卷来访问了。 只要它一被挂载，就跟其它未加密的卷是一样的了，这就意味着您想要使用它的话就需要先建立文件系统：# mkfs.vfat /dev/mapper/my_crypto_disk -n my_crypto_disk mkfs.vfat 3.0.9 (31 Jan 2010) 现在磁盘的功能完备了，可以像其它磁盘一样正常挂载使用了。实际上，如果你使用的是现代的图形用户界面系统的话，只要你把 USB 驱动盘一插入计算机，将会提示您输入密码，然后就自动挂载上了。退出的时候跟普通盘一样，里面存储的数据会被加密，直到下次输入密码。在命令行里使用 cryptsetup 卸载以及重加密驱动盘也是很简单的：# cryptsetup luksClose my_crypto_disk 这仅仅只是冰山一角写这篇文章，我的目的是希望剥开加密后面的秘密。加密和解密单个文件很简单，要加密整个 USB 驱动盘也不是太困难（如果使用的是图形用户界面工具就更容易了）。对于大多数系统的发布版本来说，在安装过程中就可以对整个 home 目录进行加密。加密是对您的整个 home 目录起作用，然而有些问题就需要特别处理了。例如，您没登陆时就运行的任务在大多数情况下是不会访问您的 home 目录的，但如果您有调度任务需要访问 home 目录的话，应该进行修改，让其访问系统中其它目录的数据。我觉得在安全和便利之中平衡的中庸之道还是加密 USB 驱动盘，然后在上面存储个人资料。我必须警告您，一但您考虑到安全的问题，就会想要把任何东西都加密起来。这不是什么坏的事情，但是像要对 home 目录加密这种情况，是会碰到一些问题的。如果您使用不同系统的话，跨平台访问也是个大问题。像这种情况，我强烈建议您使用 TrueCrypt。在前期的文章片段里我提到过 TrueCrypt，它是一款开源的，跨平台的加密系统软件。可以对文件、文件夹、分区等等进行加密，同时可以在任何系统中访问加密的数据。像 Windows、Mac 及 Linux 客户端都可以使用。社区也有大力的支持。（LCTT译注：悲惨的是，棱镜门事件之后，TrueCrypt的作者已经放弃了该产品，并且强烈建议大家也不要使用，具体可以参考本站的一些相关消息。所以痛失TrueCrypt之后，我们还有哪些替代品？）希望对文件进行加密的目的并不是为了隐藏某些东西。就像即使您有个好邻居，最好夜里也得锁门一样，对您的个人数据进行加密也是个很正常的举动。如果您想在网上与大家分享你的 Whiskerton 先生戴着可爱的小豆豆帽子的照片的话，这是您的权利。但其它的人，比如他们索检你硬盘的时候，就不需要让他们看到了。via: http://www.linuxjournal.com/content/encrypting-your-cat-photos译者：runningwater 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出