加密你的猫咪照片

作者:Shawn Powers

事实是,我的硬盘上真的没有什么东西是我不希望别人看到的。我有一些猫咪照片。我有一些文本文件,里面记录了未来书籍和/或短篇小说的想法,还有几部只写了一半的 NaNoWriMo 小说的开头。很容易说加密我的硬盘毫无意义,因为我没有什么可隐藏的。问题是,我们错误地将“渴望隐私”与“有事要隐藏”联系起来。我认为在我居住的地方,美国,我们把隐私权视为理所当然。与其像传统观念那样认为“他一定是在藏色情片或炸弹”,不如想想一些更平凡的事情。

我住在密歇根州。这里冬天很冷,我倾向于把恒温器设置在 75 华氏度左右。对你来说可能看起来很高,但对我的家人来说,这刚刚好。感谢我们家的隐私,我的邻居不知道我们家有多暖和。有些邻居如果看到 Powers 一家在冬天如此“浪费”会非常生气。事实上,有一个当地人总是要让每个人都知道,超过 60 度就是生态浪费。我不想和冰疙瘩老头吵架,所以我们只是把我们舒适的房子保密。我们没有什么要隐藏的,但这也不是每个人都需要知道的事情。

显然我的例子很傻,但希望它能让你思考。现代 Linux 允许我们轻松可靠地加密我们的数据,所以为什么不利用它呢?

它是如何工作的?

我不会详细介绍加密的工作原理,但即使是最简单的实现,也需要对基本原理有所了解。要加密和解密文件,需要两个“密钥”。一个是私钥,顾名思义,它是私有的。我喜欢把私钥想象成一把真正的钥匙——如果你愿意,你可以复制,但这样做并不明智。你制作的私钥副本越多,就越有可能被不怀好意的人得到,并闯入你的公寓——呃,我是说文件。

公钥更像是一个锁的示意图,只有你能用你的私钥打开。你可以把这个密钥提供给任何人。你可以把它发布在网站上,放在你的电子邮件里,纹在你的背上,随便你。当其他人想要创建一个只有你能看到的文件时,他们会使用你的公钥对其进行加密。

这种一对多的场景也有一个很酷的副作用。如果你使用你的私钥加密了一些东西,任何人都可以使用你的公钥解密它。这听起来可能很傻,但使这种场景有用的是,虽然加密文件不能防止窥探,但它可以保证来自你。只有用你的私钥加密的文件才能用你的公钥解密。通过这种方式,用你的私钥加密一些东西,可以对文件进行数字“签名”。

通常情况下,它是这样工作的

  1. 你有一个文件要发送给 Suzy,所以你用 Suzy 的公钥加密它。只有 Suzy 可以打开它,但是 Suzy 无法知道是你发送的,因为任何人都可以用她的公钥加密文件。

  2. 因此,你把你用 Suzy 的公钥加密的文件,再用你的私钥加密那个文件。Suzy 将不得不解密两次,但她会知道文件来自你。

  3. Suzy 收到文件,并用你的公钥解密第一层,证明文件来自你。

  4. 然后 Suzy 用她的私钥解密第二层加密,因为那是唯一能够解密原始文件的密钥。(因为你最初是用她的公钥加密的。)

当然,这种情况是用于安全传输文件时的加密。也很常见的是简单地加密你的文件(或分区),这样除非你先解密它们,否则任何人都看不到它们。让我们从文件加密开始,因为这是大多数人希望在他们的系统上做的事情。

从简单开始

在深入探讨更复杂的类型设置之前,让我们讨论一下简单地加密文件。有各种程序可以处理加密。事实上,文件和系统加密的可用选项很容易让人不知所措。今天,让我们使用一个基本的(但非常强大的)命令行工具来加密文件。GPG(Gnu Privacy Guard)是 PGP(Pretty Good Protection)的开源实现。它允许加密和签名,并管理多个密钥等等。对于这个例子,让我们简单地加密一个文件。

假设你有一个名为 secret_manifesto.txt 的文件,其中包含生命、宇宙和一切事物的秘密。使用 GPG,你可以用密码加密文件。使用密码比使用公钥和私钥对要简单得多,因为它只是使用你的密码加密。这确实使你的文件更容易被破解(使用彩虹表或其他黑客工具),但正如罐头上的标签所说,它是 Pretty Good Protection。要加密你的文件,你可以这样做


# gpg -c secret_manifesto.txt
# Enter passphrase:
# Repeat passphrase:

完成后,你将在同一目录下得到一个新文件。默认情况下,它将被命名为 secret_manifesto.txt.gpg。这是一个二进制文件,这意味着它相当小,但它不能复制/粘贴到电子邮件或 IM 中。为了便于携带,你可以添加 -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 的文件。这是纯文本的,但你可以在代码片段中看到,它也比二进制加密文件大得多,并且比原始文本文件大得多得多。一旦你加密了你的文件,如果你真的想对你的信息保密,明智的做法是删除原始文本文件。

要解密文件,你将再次使用 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 Desktop 这样的桌面环境,在格式化过程中,加密 USB 驱动器只需勾选一个复选框即可。虽然这是一种完全可以接受的加密 USB 驱动器的方式,但我将演示如何在命令行上执行此操作,以便你了解幕后实际发生的事情。

步骤 1:识别你的 USB 驱动器。

如果你在插入 USB 驱动器后输入 dmesg,你应该会得到各种系统信息,包括你新插入的 USB 设备的设备名称。确保你识别了正确的设备,因为你所做的操作将销毁驱动器上的任何数据。你不会想意外地格式化错误的磁盘。(应该不用说,但我还是要说一下,确保你的 USB 驱动器上没有任何你想保存的东西——这是一个破坏性的过程。)

步骤 2:对 USB 驱动器进行分区。

假设你的 USB 驱动器是你系统上的 /dev/sdb 设备,你需要在该驱动器上创建一个分区。让我们使用 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!

现在你有一个带有单个分区 (/dev/sdb1) 的 USB 驱动器,但上面没有文件系统。这正是你想要的,因为 LUKS 系统在分区上创建一个加密层,然后你才在上面放置文件系统。所以在创建文件系统之前,让我们使用 cryptsetup 程序在分区上创建 LUKS 层。如果你没有 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/devicename 下,所以这个例子将分区挂载在 /dev/mapper/my_crypto_disk。

这个设备现在作为未加密的卷被访问。只要它保持挂载状态,它就会像任何其他未加密的卷一样工作。这意味着如果你想使用它,你需要向它写入一个文件系统


# mkfs.vfat /dev/mapper/my_crypto_disk -n my_crypto_disk
mkfs.vfat 3.0.9 (31 Jan 2010)

现在驱动器已完全可用,并且可以像任何其他磁盘一样挂载。事实上,当你将 USB 驱动器插入你的计算机时,如果你有一个现代 GUI 桌面,它应该会提示你输入密码并自动挂载它。然后你可以像普通磁盘一样弹出它,它将被加密,直到你下次输入密码。使用 cryptsetup 在命令行上卸载并因此重新加密驱动器也很简单


# cryptsetup luksClose my_crypto_disk
这只是冰山一角

在本文中,我希望揭开加密背后的一些神秘面纱。加密和解密文件很简单。加密整个 USB 驱动器并没有困难多少(特别是如果你使用 GUI 桌面工具)。对于大多数发行版,可以在安装过程中加密整个主目录!但是,当在你的整个主目录上设置加密时,你需要解决一些问题。例如,在你未登录时运行的作业很可能无法访问你的主目录。如果你的 cron 作业需要访问你的主目录,你应该重写它们以访问系统上其他地方的数据。我发现安全性和便利性之间的一个折衷方案是加密 USB 驱动器并将我的个人数据存储在其中。

一旦你染上了加密的瘾,我必须警告你,你会想要开始加密一切东西。这不是一件坏事,但就像主目录的情况一样,你会遇到一些障碍。如果你在系统之间切换,跨平台可访问性是一个大问题。对于这种情况,我强烈推荐 TrueCrypt。我之前在 UpFront 文章中提到过 TrueCrypt,但它基本上是一个开源的、跨平台的加密系统,允许你加密文件、文件夹、分区等等,同时能够在任何系统上访问这些数据。Windows、Mac 和 Linux 客户端都可用,并且社区有很好的支持。

你不需要有东西要隐藏才能渴望为你的文件加密。就像晚上锁好你的房子是明智之举一样,即使你住在一个治安良好的社区,加密你的个人数据也是一个明智之举。如果你想在互联网上与所有人分享你家 Whiskerton 先生戴着可爱小帽子的照片,那是你的权利。但是,如果别人多管闲事,窥探你的硬盘驱动器,他们就不需要看到这些东西!

Shawn 是Linux Journal 的副编辑,并且从 Linux 诞生之初就接触 Linux。他对开源充满热情,并且热爱教学。他还喝太多咖啡,这经常在他的写作中体现出来。

加载 Disqus 评论