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

X.L*_*INK 22 encryption luks veracrypt

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

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

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

我也知道 RAID 和备份/保管库,但这不是我要找的。

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

更新 1

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

加密的分区会同样脆弱吗?(不包括主密钥、元数据和标题)

PS:对不起,如果我不立即回答,我正在世界各地工作和旅行 - 因此使这篇文章相关 - 我经常面临时间紧迫的业务。但是,我肯定会肯定地回答。

All*_*mon 19

实际上,只要您正确备份主密钥和元数据,加密的弹性几乎与不加密一样。

除了元数据,损坏只会影响损坏位的块,在大多数情况下只影响它的 16 个字节。

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

使用 Veracrypt 或 Luks,您必须将主密钥存储在磁盘中,并使用您的密码加密。损坏该扇区将导致永久数据丢失。这可以通过主密钥备份(几 KB 大小)轻松解决,这两种软件都可以轻松解决,强烈推荐给每个人。

有关非元数据的详细信息

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

关于万能钥匙的详细信息

卢克斯

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

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

以下是从https://gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions#6-backup-and-data-recovery 中提取的有关备份的 LUKS 常见问题解答副本

6.2 如何备份 LUKS 标头?

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

cryptsetup luksHeaderBackup --header-backup-file <file> <device>
Run Code Online (Sandbox Code Playgroud)

要恢复,请使用反向命令,即

cryptsetup luksHeaderRestore --header-backup-file <file> <device>
Run Code Online (Sandbox Code Playgroud)

如果您不确定要恢复的标头,请先备份当前的标头!您还可以使用 --header 选项来测试头文件而不恢复它,就像这样:

cryptsetup --header <file> luksOpen <device> </dev/mapper/ -name>
Run Code Online (Sandbox Code Playgroud)

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

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

首先确定主密钥大小:

cryptsetup luksDump <device>
Run Code Online (Sandbox Code Playgroud)

给出一行表格

MK bits:        <bits>
Run Code Online (Sandbox Code Playgroud)

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

其次,将标头转储到文件。有很多方法可以做到,我更喜欢以下方法:

head -c 1052672 <device>  >  header_backup.dmp
Run Code Online (Sandbox Code Playgroud)

或者

head -c 2M <device>  >  header_backup.dmp
Run Code Online (Sandbox Code Playgroud)

对于 2MiB 标头。验证转储文件的大小以确保。要恢复这样的备份,你可以尝试 luksHeaderRestore 或者做一个更基本的

cat header_backup.dmp  >  <device>
Run Code Online (Sandbox Code Playgroud)

维拉密

Veracrypt 类似于 LUKS。我不像使用 Truecrypt 那样使用它,但总体思路是成立的。

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

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

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

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

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

最后的想法(TL; DR)

使用主密钥损坏特定扇区的可能性比磁盘完全故障的可能性要小。因此,如果此数据很重要,您应该备份它,而不仅仅是卷标头(主密钥)。

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

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

更新 (23/01/2017):根据 OP 评论添加更多信息。


har*_*ymc 5

我在下面汇编了一些有关 VeraCrypt/TrueCrypt 容器弹性的信息。

Veracrypt 数据损坏

TC/VC 将卷头存储在两个位置:卷的开头和结尾。开头的那个是主要的,最后的那个是备用的。这种机制通常足以在驱动器的一部分损坏或损坏时启用访问,因为损坏通常是局部的。如果驱动器的开头和结尾都发生损坏,则驱动器几乎肯定已死。

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

来自VeraCrypt 常见问题解答

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

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

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

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

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

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


X.L*_*INK 0

感谢人们提供的所有答案,最终答案是 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-struct-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 的分支,因此它的工作原理肯定是相同的。

附:

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