VeraCrypt 和 LUKS 加密卷对数据损坏的抵御能力如何?

VeraCrypt 和 LUKS 加密卷对数据损坏的抵御能力如何?

问题已经部分得到解答,但这仍然不是我真正想要的。请参阅下面的更新 1

我计划使用 VeraCrypt 和 LUKS 加密一些文件系统,但我担心如果出现一个问题,我将无法再次挂载分区,从而丢失存储在其中的所有数据。(由于扇区/块损坏、写入操作期间电源故障、文件系统错误等)

此外,VeraCrypt 可能已经分叉了 TrueCrypt 的修复工具,但我并不依赖它,而是更多地关注真实案例。

我也了解 RAID 和备份/保险库,但这不是我想要的。

所以问题是:使用 VeraCrypt 和 LUKS 加密分区本身的弹性如何?

更新 1

我的问题更多的是关于加密分区及其数据的弹性,而不是关于保存主密钥、元数据或标头。这个问题类似于可靠的 7zip 存档:如果中间有一个位损坏,那么您将丢失整个存档。

加密分区是否同样容易受到攻击?(不包括主密钥、元数据和标头)

附言:如果我没有立即回复,请见谅,因为我正在世界各地工作和旅行——因此这篇文章与此相关——而且我经常面临时间紧迫的业务。但我一定会回复的。

答案1

实际上,加密和不加密几乎一样有弹性,只要你备份主密钥和元数据适当地。

除了元数据之外,损坏只会影响损坏位的块,大多数情况下仅影响其中的 16 个字节。

对于大多数数据损坏的情况,使用密钥和工具(例如您的密码和 Veracrypt/LUKS),您可以像访问非加密磁盘一样访问,就像您通常每天使用加密磁盘一样。加密只会比普通加密多一个步骤(打开加密分区)。所以在这种情况下,它的行为就像非加密数据一样。

使用 Veracrypt 或 Luks,您必须将主密钥存储在磁盘中,该密钥使用您的密码加密。损坏此扇区将导致数据永久丢失。这可以通过主密钥备份(几千字节大小)轻松解决,使用这两种软件都很容易做到这一点,强烈建议每个人都这样做。

有关非元数据的详细信息

Veracrypt 和 Luks 目前都使用 XTS。在此模式下,它会为每个块计算一个密钥。简单来说,要加密块,i您需要使用由主密钥和块号生成的密钥。因此,一个块的加密与另一个块的加密无关。如果您破坏了某些信息,则信息将仅限于该块。

在 XTS 中,它将块分成子块(通常为 16 字节),然后创建一个密钥,并使用该密钥加密该子块。这意味着如果我们对其进行一点更改,则只有这 16 个字节会受到影响。

测试表明,更改 Luks 卷中的一个位会将原始文件的 16 个字节更改为乱码,但其他 496 个字节保持不变。在 7zip 文件中,它使用流方法,即所有字节都是链接的,因此一个字节的更改会影响所有剩余字节 - 但这里的情况并非如此。

有些人认为这是一个问题,因为只需比较加密数据,您就可以以 16 个字节的精度知道何时何地更改纯文本。

您可以在以下链接上找到有关此内容的更多有趣信息:

https://crypto.stackexchange.com/questions/6185/what-is-a-tweakable-block-cipher

https://security.stackexchange.com/questions/39306/how-secure-is-ubuntus-default-full-disk-encryption

https://en.wikipedia.org/wiki/Disk_encryption_theory

关于 Master Key 的详细信息

卢克斯

LUKS 在分区(或磁盘)的开头有几个扇区,其中包含元数据,存储加密方法、其他参数和 8 个密钥槽。为了加密和解密磁盘,它使用主密钥,创建 LUKS 容器时生成的一个大随机数。为了存储它,它会使用您的密码加密主密钥,通过对密码进行多次迭代加密哈希函数并为该插槽生成特定密钥。您可以为同一个磁盘设置 8 个不同的密码,每个密码使用插槽中的不同密码加密主密钥。当您更改密码时,只需加密主密钥即可,而无需更改所有分区。

因此,当这些插槽和元数据损坏时,您无法恢复真正用于解密的主密钥,从而丢失磁盘上的所有数据。这是一种快速销毁所有数据的简单方法。但是,如果您有卷头的备份,则很容易恢复它。

以下是摘自 LUKS FAQ 中关于备份的副本https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#6-backup-and-data-recovery

6.2 如何备份 LUKS 标头?

虽然您可以直接复制 LUKS 分区开头的适当数量的字节,但最好的方法是使用 cryptsetup 的命令选项“luksHeaderBackup”。这还可以防止在创建 LUKS 分区时使用非标准参数时出现错误。示例:

cryptsetup luksHeaderBackup --header-backup-file <file> <device>

要恢复,请使用逆命令,即

cryptsetup luksHeaderRestore --header-backup-file <file> <device>

如果你不确定要恢复哪个头文件,请先备份当前头文件!你还可以使用分离头文件的 --header 选项来测试头文件而无需恢复它,如下所示:

cryptsetup --header <file> luksOpen <device> </dev/mapper/ -name>

如果这样可以解锁您的钥匙串,那就太好了。不要忘记再次关闭设备。

在某些情况下(标头损坏),此方法会失败。然后使用以下步骤:

首先确定主密钥大小:

cryptsetup luksDump <device>

给出如下形式的行

MK bits:        <bits>

旧默认值的位等于 256,新默认值的位等于 512。256 位等于 1'052'672 字节的总标头大小,512 位等于 2MiB。(另请参阅第 6.12 条)如果 luksDump 失败,则假设为 2MiB,但请注意,如果您恢复该大小,则可能还会恢复文件系统的前 1M 左右。如果您无法确定标头大小,请不要更改文件系统!这样,恢复过大的标头备份仍然是安全的。

第二步,将头文件转储到文件中。有很多方法可以做到这一点,我更喜欢以下方法:

head -c 1052672 <device>  >  header_backup.dmp

或者

head -c 2M <device>  >  header_backup.dmp

2MiB 的标头。请验证转储文件的大小以确保无误。要恢复此类备份,您可以尝试 luksHeaderRestore 或执行更基本的

cat header_backup.dmp  >  <device>

维拉克利特

Veracrypt 与 LUKS 类似。我不像使用 Truecrypt 那样习惯使用它,但总体思路还是不错的。

Veracrypt 只有一个密钥槽,因此您不能同时拥有多个密码。但您可以拥有一个隐藏卷:它将元数据存储在分区(或磁盘或文件)的末尾。隐藏卷具有不同的主密钥,并将使用分区的末尾作为重叠空间。您应该备份的想法是相同的。这可以通过和来完成Tools -> Backup Volume HeaderTools -> Restore Volume Header对于系统加密,它用于创建一个带有密钥备份的可启动磁盘,如果发生任何损坏,它可以恢复 Truecrypt 加载程序和密钥。它在加密任何东西之前就完成了,据我所知,Veracrypt 继续以同样的方式做。

有关详细信息,请参阅此链接https://veracrypt.codeplex.com/wikipage?title=Program%20Menu

关于备份密钥的安全注意事项

例如,如果您的密码泄露,并将卷密码更改为新的、强大且安全的密码,则有权访问备份的人仍然能够使用旧密码解密文件。备份基本上是用(旧)密码加密的主密钥。因此,在更改密码时,还需要进行新备份并销毁旧密码。永久销毁数据可能非常棘手。

对于使用该密码进行的每个备份,都有一种使用该密码解密数据的可能方法。例如,这可以在 Veracrypt 中使用,使用“通用密码”(例如在公司中),将其备份并更改为另一个密码。因此,即使有人丢失了密码,IT 部门也可以恢复对该卷的访问权限(将其视为主密码,但不要与之前的主密钥混淆)。

最后的想法(TL;DR)

损坏带有主密钥的特定扇区的概率比整个磁盘故障的可能性要小。因此,如果这些数据很重要,您应该备份它,而不是只备份卷标头(主密钥)。

并且数据损坏范围很小(16 个字节),因此大多数用途都可以接受。

因此,分区或磁盘中间的坏块只会影响该块。扇区中的几位错误仅限于该扇区,甚至不会影响整个 512 字节扇区。

更新(2017 年 1 月 23 日):根据 OP 评论添加更多信息。

答案2

下面我整理了一些有关 VeraCrypt/TrueCrypt 容器的弹性的信息。

Veracrypt 数据损坏

TC/VC 将卷头存储在两个位置:卷的开始和结束处。开始处的卷头是主卷头,结束处的卷头是备份卷头。当驱动器的某个部分损坏或损坏时,此机制通常足以启用访问,因为损坏通常是局部的。如果损坏发生在驱动器的开始和结束处,那么驱动器几乎肯定已经坏了。

请注意,如果驱动器损坏或损坏,您将会遭受与不使用加密时相同的数据丢失。这意味着即使您能够安装该卷,读取的数据也可能已损坏。因此,请务必考虑数据备份,因为加密无法防止数据损坏。

来自VeraCrypt 常见问题解答

当 VeraCrypt 卷的一部分损坏时会发生什么?

在加密数据中,一个损坏的位通常会损坏发生该位的整个密文块。VeraCrypt 使用的密文块大小为 16 字节(即 128 位)。VeraCrypt 使用的操作模式可确保如果某个块内发生数据损坏,其余块不会受到影响。

当我的 VeraCrypt 卷上的加密文件系统损坏时,我该怎么办?

VeraCrypt 卷内的文件系统可能会像任何正常的未加密文件系统一样损坏。发生这种情况时,您可以使用操作系统提供的文件系统修复工具来修复它。在 Windows 中,它是“chkdsk”工具。VeraCrypt 提供了一种在 VeraCrypt 卷上使用此工具的简单方法:右键单击主 VeraCrypt 窗口(在驱动器列表中)中已安装的卷,然后从上下文菜单中选择“修复文件系统”。

那么小的数据损坏应该只会产生局部影响,不会破坏整个容器。但是,我建议不要加密整个卷/分区,尤其是系统驱动器,因为这样恢复会更加复杂。做好备份,尤其是卷头。请记住,就像真正的磁盘或文件夹一样,磁盘/文件头中的损坏可能会使数据恢复变得困难,可能需要高级实用程序。

我相信 LUKS 在磁盘上没有第二个标头,因此您必须更加小心地保存备份。

答案3

以下内容与您的“更新 1”部分相关。

假设您成功安装了分区,Veracrypt 和 LUKS 都对随机数据扇区故障具有相同的恢复能力。

原因是它们都充当了操作系统扇区读写功能之下的附加层。它们提供面向扇区的加密。两种加密方案都不会改变磁盘上的结构布局。

这种操作方式并不符合固实 7z 档案存储技术的限制,甚至也不符合普通 7z 档案的存储技术的限制。

除此之外,请记住安装前的情况。LUKS 的反取证技术将元数据炸毁为 3 个扇区(标头)+ 4000(条带)* 16(假定最大密钥长度)* 8(密钥槽)字节 = 512003 字节 =~ 1000 个扇区。此结构没有可用的备份。

将其与标准 Veracrypt 标头(仅数据,无隐藏分区)进行比较,其中 512 字节 = 1 个扇区。除此之外,文件系统末尾还有一个备份标头。

与 Veracrypt 相比,LUKS 的标头弹性约为 0.1%,因为 LUKS 标头使用的一个坏扇区可能会导致磁盘无法读取。我之所以写“可以”,是因为我无法确定读取磁盘格式规范时,这样的操作是否会影响所有 8 个可用密钥槽或仅影响一个。

答案4

感谢大家提供的所有答案,最终答案是 100% 完整的。

最近我没多少时间,所以我稍后会编辑我的“自己的”答案。由于这里给出的所有答案都非常有用,因此这只是对他们所说的内容的回顾,以及我的发现。

无论如何,这是我的发现之一,它将解开我遇到的很多困惑,它主要涉及......块的含义,因为它是一个被过度和错误使用的术语:

https://sockpuppet.org/blog/2014/04/30/you-dont-want-xts/

此外,您会发现一种“标准”的方式来谈论这里的事情,并避免“阻止”混淆:

https://superuser.com/questions/1176839/what-are-every-possible-names-of-hard-drives-structure-parts

简而言之,你可以将包含单词“400”的加密块更改为“800”。这意味着加密块级层完全不牢固,而不是相信“这将像普通文件系统一样运行”(即 Veracrypt FAQ)。

另外,我应该在两个月前偶然发现这个链接:

https://unix.stackexchange.com/questions/321488/full-image-of-internal-hdd-drive-dd-dd-rescue-with-truecrypt-bad-sectors/

由于 VeraCrypt 是 TrueCrypt 的一个分支,因此它的工作原理肯定是一样的。

附言:

仍然欢迎任何其他答案,并将其添加到我的“自己的”答案中。

相关内容