在某些技术文章中,“dm-crypt”和“cryptsetup”经常被混用或并用。或者说,这两者常常被用来指代同一个东西。如果要细说的话,“dm-crypt”是 Linux 内核提供的一个磁盘加密功能,而“cryptsetup”是一个命令行的前端(通过它来操作“dm-crypt”)。
“dm-crypt”在 Linux Kernel 2.6 的早期版本就被整合到内核中,距今已经10多年了。经过这么多年发展,至少能说明如下几点:
1. 它的开源代码足够成熟
2. 它提供的功能足够通用
3. 它在安全方面足够靠谱
先大致描述一下 dm-crypt 支持的功能以及相关特色。
目前 dm-crypt 支持如下几种加密格式(模式)。
1. LUKS(Linux Unified Key Setup)
这是 dm-crypt 最常用的一种模式。在本文后续章节,俺会详细介绍。
2. Plain
Plain 模式是提供给技术老手用的。如果你是技术菜鸟,就不用关心这个模式了;如果你是技术老鸟,请自己去查 dm-crypt 相关手册。
3. loop-AES
loop-AES 是一款比较陈旧的 Linux 磁盘加密工具。dm-crypt 提供了对它的支持。
通常情况下,大伙儿【不需要】用到该模式。
4. TCRYPT
在 cryptsetup 的 1.6.0 版本之后,开始提供对 TrueCrypt 加密盘的支持。“TCRYPT”就是“TrueCrypt”的缩写。
在该模式下,可以打开 TrueCrypt 和 VeraCrypt 的加密盘,并对盘中的文件进行读写。
请注意:这个模式并【没有】实现 TrueCrypt 和 VeraCrypt 的所有功能。比如修改密码和 keyfiles 的功能就没有。具体欠缺哪些功能,参见下一章节的对照表。
由于 dm-crypt 早已被整合到 Linux Kernel 中。因此,你无需额外安装它。
至于它的命令行前端(cryptsetup),大部分主流的发行版都会内置 cryptsetup 的软件包。
LVM(Logical Volume Manager)是 Linux 内核提供的另一个很有用的工具。比如用它来创建分区,将来可以随时调整分区大小;比如现有的硬盘空间用完了,可以另外加一块硬盘并且新加硬盘可以用来扩展现有分区。
LVM 和 dm-crypt 都是基于 Linux 内核的 device mapper 机制。因此两者可以很好地整合。比如你既可以玩“LVM over LUKS”;也可以玩“LUKS over LVM”。
有空的话,俺再单独写一篇关于 LVM 的扫盲(又是一个坑)
为了让大伙儿有个直观的认识,俺整理了如下的对照表。通过对比,你可以大致了解 dm-crypt 相对于“TrueCrypt和VeraCrypt”的优缺点。
再次提醒:dm-crypt 的 TCRYPT 模式,需要 cryptsetup 的版本号大于等于1.6.0才行。
功能点 | dm-crypt 的 LUKS 模式 | dm-crypt 的 TCRYPT 模式 | TrueCrypt / VeraCrypt |
---|---|---|---|
支持的操作系统 | Linux | Linux | Windows Linux Mac OS |
支持的加密算法 | AES Twofish Serpent |
AES Twofish Serpent AES-Twofish Serpent-AES Twofish-Serpent AES-Twofish-Serpent Serpent-Twofish-AES |
AES Twofish Serpent AES-Twofish Serpent-AES Twofish-Serpent AES-Twofish-Serpent Serpent-Twofish-AES |
支持多重加密算法 | NO | Yes | Yes |
物理分区加密 | Yes | Yes | Yes |
虚拟分区加密 | Yes | Yes | Yes |
无系统分区的全盘加密 | Yes | Yes | Yes |
含系统分区的全盘加密 | YES | NO | 仅限 Windows |
加密系统分区 | Yes | NO | 仅限 Windows |
基于“密码”的认证 | Yes | Yes | Yes |
基于“Keyfiles”的认证 | Yes | Yes | Yes |
修改认证因素 | Yes | NO | Yes |
加密系统分区并用 Keyfiles 认证 | Yes | NO | NO |
隐藏卷(Plausible Deniability) | NO | Yes | Yes |
操作外层卷并对隐藏卷写保护 | NO | NO | Yes |
自定义“生成密钥的迭代次数” | Yes | NO | 仅 VeraCrypt |
在使用 cryptsetup 命令行进行操作之前,建议你先掌握如下的技能:
如何对硬盘分区(相关的命令行是 fdisk)
如何创建文件系统(相关的命令行是 mkfs.ext4 等)
如何挂载/卸载文件系统(相关的命令行是 mount umount)
如何显示已挂载的文件系统(相关的命令行是 df)
上述这几个命令都比较简单,可以自己用 man 查一下帮助。会洋文的话,应该能看懂;就算你不懂洋文,Google 一下也可以查到这几个常用命令的语法。
说完预备知识,开始来介绍 cryptsetup 的基本用法。
提醒一下:需要使用管理员权限(比如 root)来运行 cryptsetup 相关命令。
使用如下命令行查看版本号。
cryptsetup --version
因为 dm-crypt/cryptsetup 的某些新功能,只有新版本才提供。比如 cryptsetup 的版本号必须大于等于 1.6.0 才能支持 TrueCrypt 的加密盘格式。
如果你要用到这些新功能,先看一下版本号,以确保已经支持。
使用如下命令查看 dm-crypt/cryptsetup 针对不同“加密算法”和“散列算法”的性能指标。
cryptsetup benchmark
前面提到 dm-crypt/cryptsetup 支持的几种加密盘格式。作为扫盲教程,本文只介绍如何创建 LUKS 格式加密盘。
另外,dm-crypt/cryptsetup 只能用来打开 TrueCrypt 或 VeraCrypt 的加密盘,但是【无法】创建。
创建(格式化) LUKS 加密盘的命令,大致写法如下:
cryptsetup 相关参数 luksFormat 物理设备或逻辑设备
运行该命令之后,首先警告你,格式化会导致原有数据被覆盖。如果你确实要格式化,需要输入【大写】的 YES 进行确认。
然后会提示你输入两次密码(passphrase)。
输入完密码,还要再稍等片刻(创建加密盘需要时间,具体的时长取决于加密盘的大小以及相关的加密参数)。
上述写法中的【相关参数】是可以不写的。如果不写,则 cryptsetup 会采用相应的默认值。对于安全性要求较高的同学,【不要】使用默认值,要根据自己的需求指定相关的参数。
当你使用 luksFormat 进行格式化的时候,下面是几个常用参数以及俺推荐的参数值:
参数名称 | 含义 | 推荐值 | 备注 |
---|---|---|---|
--cipher | 加密方式 | aes-xts-plain64 | AES 加密算法搭配 XTS 模式 关于 XTS 模式,可以参见之前的博文: 《TrueCrypt 使用经验[1]:关于加密算法和加密盘的类型》 |
--key-size | 密钥长度 | 512 | 因为 XTS 模式需要两对密钥,每个的长度是256 |
--hash | 散列算法 | sha512 | N/A |
--iter-time | 迭代时间 | 最好大于10000 | 单位是毫秒。该值越大,暴力破解越难;但是你在打开加密盘时也要等待更久 |
下面给一个具体的例子——用 LUKS 方式创建(格式化)加密盘,该加密盘位于 /dev/sda2 分区
cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/sda2
dm-crypt/cryptsetup 可以打开前面提及的各种格式的加密(只要是它支持的格式,就可以打开)。
命令行大致的写法如下:
cryptsetup open --type 类型名 已加密的物理设备或逻辑设备 映射名
上述命令行中的【open --type 类型名】,也可以改用某种简写形式。
比如下面这个命令:
cryptsetup open --type luks 已加密的物理设备或逻辑设备 映射名
其实等价于如下:
cryptsetup luksOpen 物理设备或逻辑设备 映射名
下面举个具体的例子:
假设物理分区 /dev/sda2 采用 LUKS 加密,那么你可以用如下命令打开(命令中的 xxx 是映射名,你可以换成其它单词)
cryptsetup luksOpen /dev/sda2 xxx
执行上述命令后,原有的加密分区 /dev/sda2 就被解密并映射到 /dev/mapper/xxx
打开加密盘之后,你就【不要】再去操作 /dev/sda2 了,而应该去操作 /dev/mapper/xxx
当你已经打开某个加密盘之后,可以用如下命令查看该加密盘的状态。
cryptsetup status 映射名
当你已经打开某个加密盘之后,可以用如下命令关闭该加密盘。
cryptsetup close 映射名
与 open 类似,cryptsetup 也对 close 提供了相应的别名(比如:luksClose、tcryptClose)
实际上 cryptsetup 是根据已经打开的加密盘的 header 来判断该加密盘的类型。所以上述别名的意义不大。比如说,你对某个 TrueCrypt 的加密盘使用 luksClose,依然可以正确关闭,不会出错。
首先,你要准备一个物理分区,用来加密。
【你必须确保该分区上的数据是没用的】。因为待会儿要对该分区进行格式化操作,该分区上原有的数据会被破坏掉。
在下面的介绍中,俺以 /dev/sda2 来进行举例。你实际使用的分区,可能会有所差异(具体取决于你的分区情况)。
使用前面章节提及的参数,对上述物理分区进行加密。得到一个加密分区。
cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /dev/sda2
使用如下命令打开上述的加密分区,使用的映射名是 xxx(你也可以改用其它单词)。
cryptsetup luksOpen /dev/sda2 xxx
打开之后,该虚拟盘会被映射到 /dev/mapper/xxx
你可以用如下命令看到:
ls /dev/mapper/
由于加密分区已经打开并映射到 /dev/mapper/xxx 你可以在 /dev/mapper/xxx 之上创建文件系统。命令如下(文件系统类型以 ext4 为例)
mkfs.ext4 /dev/mapper/xxx
创建完文件系统之后,你还需要挂载该文件系统,才能使用它。挂载的步骤如下。
首先,你要先创建一个目录,作为【挂载点】。俺把“挂载点”的目录设定为 /mnt/xxx(当然,你可以用其它目录作为挂载点)。
mkdir /mnt/xxx
创建好“挂载点”对应的目录,下面就可以进行文件系统的挂载。
mount /dev/mapper/xxx /mnt/xxx
挂载好文件系统,用如下命令查看,就可以看到你刚才挂载的文件系统。
df -hT
接下来,你就可以通过 /mnt/xxx 目录去访问该文件系统。当你往 /mnt/xxx 下面创建下级目录或下级文件,这些东东将被存储到加密分区上。
当你使用完,要记得退出。包括下面两步:
卸载文件系统
umount /mnt/xxx
关闭加密盘
cryptsetup close xxx
在前一个章节,已经介绍了“对物理分区的加密”。其实 cryptsetup 也可以支持虚拟加密盘(逻辑加密盘)——类似于 TrueCrypt 那样。
考虑到某些读者没有看过《TrueCrypt 使用经验[1]:关于加密算法和加密盘的类型》,俺再次唠叨一下:所谓的“虚拟加密盘”,就是说这个盘并【不是】对应物理分区,而是对应一个虚拟分区(逻辑卷)。这个虚拟分区,说白了就是一个大文件。虚拟分区有多大,这个文件就有多大。
“虚拟加密盘”的一个主要好处在于——可以拷贝复制。比如你可以在不同的机器之间复制这个虚假分区对应的大文件。甚至可以把这个大文件上传到云端(网盘)进行备份——这么干的好处参见《文件备份技巧:组合“虚拟加密盘”和“网盘”》。
下面用 dd 命令创建1GB(1024MB)的大文件,该文件位于 /root/luks.vol 路径。当然,你也可以指定其它的文件大小或其它的文件路径。
dd if=/dev/zero of=/root/luks.vol bs=1M count=1024
(dd 命令是一个牛逼命令,之前在《如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)》介绍过该命令)
经某个热心读者提醒,还可以使用 fallocate 命令创建容器文件。对于特别大的容器文件,性能【高于】dd 命令。
以下示例通过 fallocate 瞬间创建一个 64GB 的大文件。
fallocate -l 64G /root/luks.vol
使用前面章节提及的参数,对上述文件容器进行加密。得到一个虚拟的加密盘。
cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 10000 luksFormat /root/luks.vol
使用如下命令打开上述的文件容器,使用的映射名是 xxx(你也可以改用其它单词)。
cryptsetup luksOpen /root/luks.vol xxx
打开之后,该虚拟盘会被映射到 /dev/mapper/xxx
你可以用如下命令看到:
ls /dev/mapper/
由于加密盘已经打开并映射到 /dev/mapper/xxx 你可以在 /dev/mapper/xxx 之上创建文件系统。命令如下(文件系统类型以 ext4 为例)
mkfs.ext4 /dev/mapper/xxx
创建完文件系统之后,你还需要挂载该文件系统,才能使用它。挂载的步骤如下。
首先,你要先创建一个目录,作为【挂载点】。俺把“挂载点”的目录设定为 /mnt/xxx(当然,你可以用其它目录作为挂载点)。
mkdir /mnt/xxx
创建好“挂载点”对应的目录,下面就可以进行文件系统的挂载。
mount /dev/mapper/xxx /mnt/xxx
挂载好文件系统,用如下命令查看,就可以看到你刚才挂载的文件系统。
df -hT
接下来,你就可以通过 /mnt/xxx 目录去访问该文件系统。当你往 /mnt/xxx 下面创建下级目录或下级文件,这些东东将被存储到该虚拟加密盘上。
当你使用完,要记得退出。包括下面两步:
卸载文件系统
umount /mnt/xxx
关闭加密盘
cryptsetup close xxx
其实这个概念,在当年扫盲 TrueCrypt 的教程中(《TrueCrypt——文件加密的法宝》)已经有提及。今天俺再重复罗嗦一下。
传统的“密码认证”用的是一串密不示人的字符串作为认证因素。密码的缺点:
1. 当你密码设置得比较短,容易被暴力破解。
2. 不好记。尤其当你为了防范暴力破解,把密码设置得很复杂,于是就更不好记了。
而“keyfile 认证”就是用一个文件来替代密码,可以解决密码的上述两个缺点。
用信息学的术语来讲就是:文件内容的“熵值”越大,越适合作 keyfile。换用通俗的人话来讲就是:文件内容越紊乱越随机,就越适合。
通常而言,二进制可执行文件(比如 exe)、图片文件(比如 JPG、PNG、GIF)、视频文件,都可以用来作 keyfile。
对于 Linux 的用户,可以用如下命令生产一个【内容完全随机】的文件,作为 keyfile 使用。
dd if=/dev/urandom of=放置keyfile的文件路径 bs=1k count=64
(上述命令生产的文件大小是 64KB,你可以自行设定其它尺寸,但是【不要】小于1KB)
另外,【不建议】用纯文本文件作 keyfile——因为纯文本文件的“熵值”通常都不够大。
在继续介绍 keyfile 之前,稍微聊点预备知识。
LUKS 格式的加密盘,默认会提供8个“Key Slot”(编号从0到7)。每个“Key Slot”好比是一个独立的钥匙——都可以用来打开这个 LUKS 加密盘。
你可以用如下命令,查看某个 LUKS 加密盘的“Key Slot”。
cryptsetup luksDump 已加密的物理设备或逻辑设备
如果你刚才已经尝试过创建一个 LUKS 加密盘,用了这个命令之后,你会发现8个“Key Slot”中,头一个(编号为0的那个)已经被用掉了(显示为“ENABLED”),其它7个还没用(显示为“DISABLED”)。因为你刚才创建加密盘的时候,已经设置过一次密码,所以用掉了一个“Key Slot”。
明白了“Key Slot”之后,咱们可以开始给 LUKS 加密盘增加新的“Key Slot”。
采用如下命令,可以指定某个文件作为 keyfile,并指派为某个 LUKS 加密盘的认证因素。
cryptsetup luksAddKey 已加密的物理分区或虚拟盘 所用keyfile的路径
再次使用前一小节提及的 luksDump 查看一下,你会发现:又有一个“Key Slot”被用掉了。
如果你执行完前一个小节的步骤(设定了 keyfile),接下来就可以用如下命令打开该 LUKS 加密盘。
cryptsetup --key-file 所用keyfile的路径 luksOpen 已加密的物理分区或虚拟盘 映射名
(此时,你既可以用密码打开,也可以用 keyfile 打开)
采用如下命令,可以删除某个 LUKS 加密盘的“Key Slot”。
cryptsetup luksKillSlot 已加密的物理分区或虚拟盘 Slot的编号
(再次提醒:编号是从0到7,头一个 Slot 的编号是0)
再次使用前一小节提及的 luksDump 查看一下,你会发现:某个“Key Slot”被删除了。
(再次罗嗦:cryptsetup 的版本号需要【大于等于 1.6.0】才能兼容 TrueCrypt/VeraCrypt 加密盘)
在前面的“功能概述”中提及:dm-crypt/cryptsetup 可以用来打开 TrueCrypt/VeraCrypt 加密盘。
命令行的大致写法如下:
cryptsetup open --type tcrypt 已加密的物理分区或虚拟盘 映射名
也可以使用简写的方式如下:
cryptsetup tcryptOpen 已加密的物理分区或虚拟盘 映射名
在 TCRYPT 模式下,有一些相关的参数,简要说明如下:
参数名称 | 说明 | 参数值 |
---|---|---|
--tcrypt-hidden | 打开隐藏卷,需要追加该参数 | 无 |
--tcrypt-system | 打开加密的系统分区,需要追加该参数 | 无 |
--readonly | 以“只读”方式打开加密分区,需要追加该参数 | 无 |
--key-file | 如果该加密盘用到了“keyfiles”认证,需要追加该参数 | keyfile 的路径 |
--veracrypt | 打开 VeraCrypt 格式的加密盘,需要追加该参数 | 无 |
关于 VeraCrypt 的补充说明:
cryptsetup 的版本号要大于等于 1.6.7 才可以打开 VeraCrypt 的加密盘。由于这个功能是近期才加入 dm-crypt/cryptsetup,好像还不支持 VeraCrypt 的 PIM 功能——(俺简单测试了一下)如果 VeraCrypt 加密盘设置了 PIM,用 cryptsetup 对其进行 open 操作,没有提示俺输入 PIM,然后显示打开失败。
估计要等 cryptsetup 更新的版本,或许就会支持 VeraCrypt 加密盘的 PIM 功能。
(关于 PIM 功能,参见《扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品》)
在本文开头,俺已经说了——这篇教程面向技术菜鸟。而“加密系统分区”对技术菜鸟来讲,有一定难度。万一没搞好,可能会把系统搞坏掉(导致 Linux 系统无法启动)。
咋办捏?俺帮大伙儿想了一招比较简单的玩法——在安装系统的时候,加密系统分区(甚至全盘加密)。
能否使用这招,要看具体的 Linux 发行版,在安装过程中是否提供相应的功能。如果俺没记错的话,如下几个主流的发行版,是可以在安装过程中加密系统分区或全盘加密的。(如果你觉得俺列举的发行版,有遗漏,欢迎到博客留言进行补充)
Debian
Fedora
Ubuntu
Linux Mint
CentOS
RedHat Enterprise Linux
由于不同的发行版,安装界面各不相同,所以俺就偷懒一下,不提供截图了。
大体上,这些发行版的安装过程,都有一个步骤是“硬盘分区”。在这个步骤,会提供相关的“加密选项”。
对于想要进行全盘加密的同学,装系统过程中进行分区的时候,要把 /boot 单独分一个区。并且这个分区是【不能】加密的——因为 /boot 要用来放置引导管理器与内核。
从理论上讲:任何一种磁盘加密工具,(在不借助外部机制的情况下)都【不可能】实现真正的“自启动全盘加密”。
为啥捏?因为要想【自启动】,必须要有一个引导程序,至少这个引导程序不能加密(引导程序如果被加密了,就无法引导了)。所以,凡是能够实现“自启动全盘加密”的,其【引导程序】都是明文的(无加密的)
比如 TrueCrypt 和 VeraCrypt 进行全盘加密,都会替换原有的主引导扇区的内容,在里面放入一段代码。这段代码会在开机启动的时候,提示你输入密码,然后用你输入的密码进行解密。
对于 dm-crypt 的全盘加密,除了“主引导扇区”【没有】加密,还包括 /boot 分区也【没有】加密(因为启动管理器放置在 /boot 分区)。
如前所述,这些【没有加密】的部分,会成为攻击者瞄准的弱点。
攻击举例:
如果某个攻击者可以物理接触你的电脑,此人完全可以把你硬盘上的引导程序替换为一个假的引导程序。当你开机启动的时候,这个【假的】引导程序照样会提示你输入解密的密码。如此一来,你的密码就泄漏了。
常规的防范措施有如下几种:
采用 BIOS 提供的“硬盘口令”功能
一般而言,台式机没有这个功能;大部分商用笔记本有这个功能。
这个功能的安全性如何,要看具体的笔记本品牌(不同厂商的实现,可能不一样,因此安全性也不一样)。如果这个功能比较靠谱,就可以防止攻击者在你不知情的情况下,替换你硬盘上的引导程序。
采用外部存储介质进行引导
简而言之,就是把引导程序放到【可引导的】外部介质(比如 U盘、SD卡、MMC卡)。先用外部介质进行引导,然后通过外部介质中的引导程序,提示你输入密码,然后解密硬盘,最后再启动硬盘上的操作系统。
对于“U盘/SD卡/MMC卡”而言,因为可以随身携带或隐藏在某处,被攻击者物理接触的风险会降低。
对于 TrueCrypt/VeraCrypt【没法】用这招。而对于 dm-crypt,可以用这招。这种玩法略显复杂,不适合菜鸟。考虑到本文是“扫盲性质”的教程,暂且不提。
把系统安装到外部存储介质
这种玩法就是把【整个操作系统】都安装到外部存储介质(比如 U盘、SD卡、MMC卡)。开机时,需要先插入外部存储介质,启动整个操作系统。然后在这个操作系统中内置的 dm-crypt 挂载加密的硬盘。
对于“U盘/SD卡/MMC卡”而言,因为可以随身携带或隐藏在某处,被攻击者物理接触的风险会降低。
很多主流的 Linux 发行版,默认提供了 Live CD 的功能(也就是用光盘直接启动出一个【可用】的 Linux 环境)
对这类发行版,你可以用工具把 Live CD 的 ISO 镜像文件“烧制”到 U盘/SD卡/MMC卡。然后就可以用来启动电脑。具体的教程参见《如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)》。
在本文结束前,俺最后聊一下如何混用 dm-crypt 和 TrueCrypt/VeraCrypt。
在本文开头部分给出了一个“功能对比”的清单,从中可以看出 dm-crypt 和 TrueCrypt/VeraCrypt 各有独到之处。
比如 dm-crypt 可以用来加密 Linux 的系统分区(root filesystem),而 TrueCrypt 和 VeraCrypt 都做不到;
反之,TrueCrypt 和 VeraCrypt 提供了“隐藏卷”的功能。可以用该功能来实现“Plausible Deniability”(介绍参见“这里”),而 dm-crypt 做不到这点。
因此,有必要组合这两者。
截止俺写本文的时候,TrueCrypt 的 Linux 版本【尚未发现】高危漏洞,所以你如果要继续使用 Linux 下的 TrueCrypt,也是可以的。
但是考虑到 TrueCrypt 已经停止维护,长远来讲,还是建议用“dm-crypt + VeraCrypt”这个组合进行混用。
另外,VeraCrypt 增加了 PIM 功能来对抗暴力破解。对那些安全要求非常高的同学,这个“PIM 功能”也是有吸引力的。(关于 PIM 功能,参见《扫盲 VeraCrypt——跨平台的 TrueCrypt 替代品》)
首先用 dm-crypt/cryptsetup 对系统分区(root filesystem)进行加密 或者 实现全盘加密。(具体玩法参见前面的章节)
然后在已经加密的分区中,创建 TrueCrypt/VeraCrypt 的虚拟加密盘,并使用隐藏卷的功能。(如何使用隐藏卷,参见《TrueCrypt 使用经验[4]:关于隐藏卷的使用和注意事项》)
把你最敏感最重要的数据,存储在隐藏卷中。
假设将来有一天,你受到胁迫,你可以交出 dm-crypt 的加密密码。然后利用隐藏卷这个功能,来施展“Plausible Deniability”的技巧,迷惑胁迫你的人。关于该技巧的使用场景,参见这篇博文中的“◇Plausible Deniability”章节。
本来这个话题应该是放到之前那篇博文来聊的。但是在写前面那篇博文的时候,俺还没有扫盲“dm-crypt/cryptsetup”。所以只好把这个话题留到今天这篇博文。
从俺博客的读者留言中,可以看出某些人对这两款工具都不太放心。
TrueCrypt
虽然历史悠久,口碑极好。但是官网已经宣布“停止维护”。而且上个月底(9月底)刚曝光了 Windows 版本的高危漏洞。
VeraCrypt
因为这个开源项目的历史比较短,有些同学担心这个项目会不会是一个蜜罐项目。
先不管这两个软件在【代码层面】是否有后门,咱们先来说【加密盘的格式】。
“加密盘格式”与“程序代码”不同。“加密盘格式”是很少变化的(基本是静态的),而“程序代码”会随着软件版本的升级,而不断发生变化——有可能这个版本没有后门,但是下一个版本就被植入后门。
“TrueCrypt 的加密盘格式”已经被很多安全专家研究过。包括这两年安全界发起了对 TrueCrypt 的安全审计,其中一项工作就是:评估加密盘的格式。
到目前为止,至少【没有】发现该格式有明显的后门或弱点。
综上所述,俺认为 TrueCrypt 的加密盘格式是可靠的(可信的)。
而 VeraCrypt 的加密盘格式,跟 TrueCrypt 的格式几乎完全一样——俺专门看过这两者的技术规范文档,加密盘头部(header)的结构完全一样,仅有的差异在于某个标志位(从 TrueCrypt 的标志改为 VeraCrypt 的标志)。
因此,VeraCrypt 的加密盘格式,也是可靠的(可信的)。
基于上述分析,有一个策略可以帮你规避 TrueCrypt/VeraCrypt【软件本身】潜在的后门。具体步骤如下:
1.
你在某个操作系统虚拟机中,安装好 TrueCrypt 或 VeraCrypt。
2.
使用虚拟机中的 TrueCrypt 或 VeraCrypt 帮你创建【虚拟】加密盘。
3.
把创建好的【虚拟】加密盘 copy 到你的 Linux 环境中,用 dm-crypt 打开加密盘进行使用。
4.
如果需要修改加密盘的密码或 keyfile,再把【虚拟】加密盘 copy 回操作系统虚拟机中,用 TrueCrypt 或 VeraCrypt 修改密码或 keyfile。
基于上述步骤,你的 Linux 系统中完全不会运行 TrueCrypt 或 VeraCrypt,但是又可以享受这两款软件的强大功能(比如“隐藏卷”、比如“多重加密算法”)。
代价就是:操作步骤稍嫌繁琐(需要 copy 虚拟加密盘)。这也是没办法滴——“安全性”和“易用性”通常都是矛盾的。