常见的FDE软件(TrueCrypt,BitLocker,dm-crypt)不对磁盘上存储的密文进行身份验证。普遍引用的原因是“这将占用太多空间”,原因是您将需要为每个扇区使用身份验证标签,并且将占用大量可用空间。

具有512字节的扇区和HMAC -SHA256进行身份验证,如果每个扇区都经过完全身份验证,则将消耗大约6%的磁盘空间。我可以理解,有人会认为这个数目太多了,但是如果是这种情况,您可以将HMAC标签截短到例如64位(还好于没有,对吗?),并使用少于2%总空间。

具有4096字节的扇区,空间是完全没有问题的,每个扇区的HMAC标签花费的空间不到1%。特别是对于具有可延展性的重大风险的AES-CBC-ESSIV,这似乎是值得付出的代价。

鉴于使用CBC,无论如何每次都需要重新加密整个行业,即使在性能方面也看不到身份验证有多重要。

评论

但是,那么您就需要在磁盘上或提供给OS的磁盘上具有非2幂幂扇区。我怀疑任何一个都会对此感到高兴。

另外,您还需要一棵梅克尔树来进行正确的身份验证。

是否有一些额外的身份验证可以阻止的攻击?攻击者可以修改(加密的)磁盘并修改数据,但是它将作为垃圾进行解密;文件校验和(例如ZFS或文件IDS)将检测到这种篡改。

某些文件系统具有此功能。例如ZFS使用256位哈希。

可以将@ v7d8dpo4 ZFS配置为使用SHA-256。默认情况下,至少Linux上的ZFS似乎使用32位Fletcher校验和(称为fletcher4)。也可以将其配置为完全不进行校验和。

#1 楼


具有4096字节的扇区,空间是完全未发行的,少于1%


问题1:每TB 10GB并非“完全未发行”很多人。

问题2:

如果校验和位于其数据块内部,则存在巨大的兼容性问题。每个块的数据小于512/4096,但是几乎所有重要OS的许多(确实很多)程序和内核部分都依赖于此。 (无论是为了工作,还是为了速度。确切地说,这个数字,不仅仅是因为它是2的幂或类似的幂)。

鉴于有人修改了Truecrypt等之下的所有内核部分,因此依赖于此的其他部分和用户级程序将突然变慢。如果在读取块1,2,3之前有东西;现在它将显示为1,2,2,3,3,4;即。是所需块计数的两倍,并且(更重要的是)非顺序=>慢。

如果校验和在数据块之外,即每个X数据块都有一个完整的校验和块。每256个数据块1个校验和块。然后,为了在块1中读取/写入1个字节,磁盘需要块1和256。同样,最好还是非顺序的。

问题3:

什么是攻击情形?有人窃取了磁盘并在以后将其归还?在这种情况下,在再次正常使用之前进行一次检查就足够了。因此,许多文件系统已经具有每个文件的校验和(不是每个块,但不是必需的)。意思是,每块校验和首先是没有用的。

评论


$ \ begingroup $
问题2可能是无法克服的。如果您破坏了单个扇区的写原子性规则,那么太多的软件将很难解决。以前的IDE磁盘读/写长允许直接访问ECC位。从理论上讲,您可以在这些位上实现它,但要付出高昂的可靠性。
$ \ endgroup $
–约书亚
16年11月4日在16:22

$ \ begingroup $
#3-如果您不使用secureboot,我会更担心被覆盖的bootloader。
$ \ endgroup $
– Maciej Piechotka
16年11月4日在19:08

$ \ begingroup $
将校验和存储在数据本身之外的其他位置是ZFS使用Merkle树数据结构来确保数据完整性的基本思想之一。结合将数据存储在一个位置并将其校验和存储在另一个位置与ZFS的写时复制行为,并使用实现适当写屏障的磁盘相结合的事实,几乎可以保证检测到任何损坏(但是,存在性能之间的权衡;需要高性能的情况下,ZFS并不是文件系统的首选,尤其是在旋转生锈时。我相信Microsoft的ReFS的工作原理非常相似。
$ \ endgroup $
–用户
16-11-4在22:24



$ \ begingroup $
问题1很少有问题。存储很便宜; 1%是微不足道的费用。问题2并不是真正的问题:您需要一个新功能,为此编写了一个新驱动程序。时间是一个更大的问题:完整性甚至真实性保护仅具有很小的空间开销,但是它却具有相当大的时间开销,因为无论您如何操作,每次读取/写入一个块都需要读取和写入多个块。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年7月7日在1:47



$ \ begingroup $
我的答案的最新注释:当然,块校验和并不是完全没用的-它们对于检测位腐烂等很有用。但这与恶意攻击无关。
$ \ endgroup $
–deviantfan
17年1月11日在10:50

#2 楼

身份验证和概率加密是两个理想的功能,每个功能都占用少量的额外空间。而且您绝对正确,在大多数情况下,空间消耗的百分比无关紧要。一样的大小。那是一个重大的实际问题。

从阅读上来说不是主要问题。例如,如果每个512字节的逻辑扇区需要592字节物理存储在磁盘上,则只需将32个连续的逻辑扇区的每组存储在37个连续的物理扇区中。一小部分的顺序读取速度减慢是可以预期的。而且每次搜索也稍微贵一点,因为每次执行搜索时您都需要读取一个额外的物理扇区。在大多数情况下,在写入一系列逻辑扇区时,仅需部分写入第一个和最后一个扇区即可。这意味着加密层必须读取,更新和写回原始文件。这花费了昂贵的额外寻找。此外,加密层可能事先不知道哪个是要写入的最后一个扇区,因此它可能最终对要更新范围中间的扇区执行读-修改-写周期。但情况变得更糟。如果操作由于某种原因被中断(例如内核冻结或电源故障),则循环可能尚未完成,这可能会破坏您的数据。

如果物理磁盘保证原子更新,则逻辑层不能保证原子更新。相反,逻辑层可能会给您留下一个逻辑扇区,该逻辑扇区在每次尝试读取时都会产生读取错误。

如果物理磁盘不能保证原子更新,则情况会更糟。最后写入的物理扇区可能包含与两个或多个逻辑扇区相关的数据。如果由于写入期间发生电源故障而损坏,则逻辑层不仅会丢失正在写入的逻辑扇区,还会丢失附近的其他逻辑扇区,这些逻辑扇区在电源故障时甚至没有被写入。

文件系统层存在非常类似的问题,其中一种常见的解决方案是日记。但是在块层引入另一个日志意味着更多的速度下降和额外的磁盘空间使用。通过将加密移到文件系统层可以减轻这种开销。但是存储加密很难按原样进行,将其与文件系统层集成会使其变得更加复杂,从而更容易出错。

一旦意识到保护单个部门的完整性甚至还不够。如果每个扇区都由MAC(或类似介质)单独保护,则对手可以有选择地将单个扇区恢复到较早的时间点。

通过有选择地还原扇区的子集,对手可以构造不包含以下内容的内容:匹配任何较早的时间点。攻击者可以将一个文件存在时的元数据与另一个文件存在时的数据扇区合并。这意味着对手已经成功地将受保护的数据从一个文件移动到了另一个文件。如果其中一个文件是高度机密的,而另一个文件是您可以与任何人愉快共享的文件,那么对手将能够触发机密数据的泄漏。

您可以通过在磁盘上计算哈希树并存储该树的根的MAC来防止这种情况。这使更新变得更加复杂,并且更新扇区现在将需要对数时间而不是我们过去所需要的恒定时间。加密代码。如果做所有加密的代码没有受到保护,那么对手可以简单地修改该代码以绕过所有安全措施。不仅加密代码本身,而且所有用于引导系统到可以开始读取加密磁盘的代码都需要受到保护。

评论


$ \ begingroup $
关于哈希树:然后有人来获取完整的磁盘映像,并在以后将其写回... :)
$ \ endgroup $
–deviantfan
16-11-3在20:30



$ \ begingroup $
@deviantfan是的。但是在那种情况下,对手只能写回所选时间点的精确图像。如果对手可以选择可能被利用来泄露数据的扇区。
$ \ endgroup $
–卡巴斯德
16年3月3日在20:35

$ \ begingroup $
是的...(我的评论仅是同意您的回答,即整个想法都是一个问题)
$ \ endgroup $
–deviantfan
16年11月3日在20:40

$ \ begingroup $
您的编辑使我意识到我正在编写的程序完全不同(但很重要):D谢谢!可惜我不能多次投票。
$ \ endgroup $
–deviantfan
16年11月3日在20:47

$ \ begingroup $
@JonCallas但是SSD的最佳机会是,如果磨损平衡,加密和文件系统日志记录层可以更好地集成在一起。如果这些层协同工作,则有可能实现更好的安全性,可靠性和性能。当前的块层接口无法做到这一点。但是,我还没有足够地说明这种新界面的外观。
$ \ endgroup $
–卡巴斯德
16年11月8日在22:01

#3 楼


那么,是否有我不使用身份验证的原因?


我相信真正的原因实际上不是空间,而是时间。

正如您所说,存储标签并不需要那么多空间。但是,标记需要存储在某个位置,并且每当您读取扇区时,还需要读取包含标记的扇区。因此,除非您可以神奇地增加扇区的大小(磁盘制造商可以通过正确格式化磁盘介质来做到这一点,但是没有其他人可以做到),当操作系统要求读取一个扇区时,您实际上需要读取两个扇区。

评论


$ \ begingroup $
...或者您需要按标签的大小来缩小扇区大小,并将新的大小报告给OS,但这会导致496个字节等类似的扇区大小。
$ \ endgroup $
– SEJPM♦
16年3月3日,19:29

$ \ begingroup $
@SEJPM:并非所有操作系统都可以处理像这样的奇特大小的扇区...
$ \ endgroup $
–雨披
16年11月3日,19:30

$ \ begingroup $
FDE驱动程序可以缓存那些标记块。这确实增加了数据丢失的风险(因为所有写操作都必须在相关联的标记块也被更新之前才是不完整的),但是现代文件系统无论如何都需要处理类似的问题(例如写重新排序)。
$ \ endgroup $
–类风湿
16-11-4在10:25



$ \ begingroup $
时间只是问题之一,而存储标签并不是主要问题。真正的问题是您需要存储标签等的标签,并且该链将终止于某个地方,然后您将如何处理?看到卡巴斯德和我的答案。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年11月7日在1:45

$ \ begingroup $
@吉尔斯(Gilles):这是更有效的批评。是的,回滚攻击更难解决。
$ \ endgroup $
–雨披
16年11月7日在20:06

#4 楼

它所防御的威胁很少见

加密可以防御持有数据的攻击者。典型的威胁是笔记本电脑或备份磁带被盗,远程备份服务器被盗等。谁在乎攻击者是否可以修改数据?无论如何,您都不会使用它的副本。

一旦攻击者获得了被入侵系统的访问权限,该系统就不再是可信赖的。一旦他们可以访问您的计算机,它就不再是您的计算机了。即使其上的数据受到完整性保护,系统本身的完整性也面临风险。例如,攻击者可能已插入硬件键盘记录器或其他间谍设备。因此,通常没有必要尝试从受威胁的系统中恢复数据。

完整性保护可以防御邪恶的女佣类型的攻击,在这种类型的攻击中,攻击者无需被检测即可访问系统。这些比简单的盗窃或(检测到的)远程破坏要少得多。如果代价高昂,则抵御罕见的威胁是不值得的,而如果处理不当,则抵御威胁的价值就更不值得了。正如我在上面所写,在许多情况下,完整性硬件本身可能会受到损害,这使得数据完整性毫无意义。但是,让我们假设硬件没有受到损害。您可以保护数据的完整性吗?那不是那么容易!

反正通常是不可能的

仅加密就可以完成机密性保护。完整性保护不一样。

您如何信任信任?

考虑具有全盘加密的系统。尽管有“全盘”的字面意思,但实际上其中必须有一些未加密的数据,即引导系统,磁盘和控制台驱动程序所需的代码,提示输入密码或其他凭据并解密的代码数据。这段代码不需要是机密的,它是任何人都可以看到的操作系统的一部分。代码确实需要受到保护。否则,攻击者可以用包装程序替换引导程序代码,该包装程序假定一切正常,但实际上会将您的所有数据转发到big-brother.gov.oceania

如何保护引导程序代码?您不能使用密码学,因为在使用验证码之前必须先验证其安全性。 Catch-22。

如果您确实信任硬件,则可以通过将引导程序代码放入ROM中来获得完整性保护。由于ROM代码受到物理保护,因此无需加密。 (这假设ROM确实是ROM-在ARM平台上就是这种情况,但是x86通常是从闪存引导的,这使它成为更大的问题。)通常,ROM代码是一小段代码,可以加载第二个更大的代码来自磁盘或闪存的代码,然后在执行之前对其进行验证,然后该代码依次验证并执行另一段代码,依此类推。
这称为安全启动链。 br />
假设您具有ROM代码,该ROM代码在执行前先验证了从磁盘/闪存加载的引导加载程序的签名,那么该代码仅会验证引导加载程序的真实性,而不是完整性。通常,ROM会验证签名而不是哈希值,以便升级引导加载程序-如果ROM验证哈希值,则它也可能包含引导加载程序代码,因为每种版本的引导加载程序代码都只能使用一个版本。但是如果引导加载程序可以升级,那么它也可以降级。特别是,如果引导加载程序的较旧版本中存在安全漏洞,则对手可以安装该版本并利用该漏洞。

仅使用ROM,就无法防御这种降级攻击。您至少需要一点点可变的持久性存储,才能记录授权哪些版本的Bootloader。如果您可以阻止攻击者访问该闪存,则闪存是可以的,根据环境的不同,这并非总是可能的。 TPM是PC上的常用解决方案。为此,某些设备(例如某些智能手机)具有一个特殊的闪存分区,称为RPMB(具有重放保护的内存块,请参见1)。可以做到的是保护数据的真实性,而不是数据的完整性。

代价不只是空间开销。

假设您已经解决了信任引导问题。您假设攻击者无法修改您的硬件。根据情况,这可能是现实的假设,也可能不是,但是让我们继续吧。并且您拥有受保护的存储来检测完整性违规,或者您已辞职以仅拥有真实性保护。现在,您要在系统上工作并修改文件,这需要更新其真实性/完整性数据。如何运作?

当威胁模型是攻击者窃取存储设备然后访问它时,您最多只需要抵抗选定的纯文本攻击(对手可能说服您在窃取磁盘之前存储某些文件),这很容易实现。特别是,从块位置隐式导出IV的密码模式是可以的,并且节省了必须将IV保存在某个地方的成本。这不仅涉及磁盘空间,还涉及更新IV的存储位置,或者文件系统块小于基础存储介质的块。

当攻击者可以看到多个版本的存储(例如,他们窃取了多个磁盘级备份)时,事情变得更加复杂,即使是出于机密保护的目的;例如,您绝不能重复使用IV,因为这样会泄漏有关更改哪些数据的信息。甚至让攻击者知道磁盘上的哪些块正在更改泄漏信息。

为了完整性或真实性,完整性数据必须存储在某个地方,因此您无法避免开销。但是,您还需要更多。您还需要将完整性数据与它所保护的内容以及文件系统的整体版本相关联。因此,您不能仅获取block_number || block_content的MAC:这将使攻击者可以替换较旧的块副本-块级降级攻击。

有一个标准的解决方案:哈希树。以树结构组织块,其中块的父级包含其子级的完整性数据。每次更新块时,其父级也需要更新,依此类推直到树的根。如果您有受物理保护的存储,请使用它存储根的完整性数据;否则,最好的方法是对根进行身份验证,这意味着可以降级文件系统(回滚攻击),但至少只能将其回滚到有效的较早版本。

需要更新完整性数据需要付出代价。这超出了存储和加载更多数据的简单算术成本。它还严重损害了并行化和重新排序。在验证该块的完整性之前开始处理块中的数据是不安全的(或者,如果这样做,则必须跟踪数据依赖性并回滚对原来已损坏的数据的任何依赖性)。除非您完全信任系统及其电源的稳定性,否则就无法再对写入进行性能排序,因为写入重排序基于数据无论哪种方式都有意义的假设。如果完整性数据被无序写入并且系统崩溃,则无法将合法的,不是最新的数据与直接攻击区分开,除非您保留一些有关旧数据的信息,在这种情况下,您需要付费

在大多数情况下,付出那笔费用是不值得的,因为无论如何您都无法保证完整性或真实性。在某些情况下,例如远程备份,有一个本地受信任的系统可以验证备份的完整性,但这是一个非常不同的用例,通常无法通过文件系统接口进行访问。这就是为什么加密文件系统很少提供完整性保护的原因。

#5 楼

技术论点(空间/性能)实际上是红色鲱鱼。认证可以通过多种方式实现,而不必以每个部门为基础。它主要是需要身份验证的文件,而不是扇区。 MAC不必与相关的紧身胸衣一起存储。在当今的永久存储市场中,6%的开销无关紧要。

实际原因很可能是磁盘身份验证的目的很少。存储设备运行所需的全部操作就是OS文件系统完整性检查。也可以使用TRIPWIRE之类的文件验证工具。在您拥有的磁盘上的中间攻击中没有认真的人。您不会将其传送给其他人,而让它们在通过以太时会改变它们。

身份验证和加密一样需要密码。如果您拥有一个,则可以合理地指望拥有另一个。如果您都没有,幽灵卡住了。尽管在美国和中国这样的司法管辖区,他们很可能仍会获得密码,但是也有例外。

因此,在相信您可以完全控制它的同时,必须对其进行篡改。因此,间谍软件已安装在您的计算机上。因此,一切皆有可能,他们只是欺骗了报告组件的输出,以告诉您一切都是船形,而他们拥有完全的控制权。我们从Snowdon得知,某些磁盘固件已在出厂时作为NSA Bullrun程序的一部分被盗用。如果您面对这样高的预算/影响力,可以做很多事情来规避它,这又一次又破坏了对身份验证的需求。

尽管他们可能只是没想到当他们发明它的时候。

评论


$ \ begingroup $
除了您对MITM概率的判断外,我基本上同意。 USB拇指驱动器上具有加密的驱动器(容器)并不少见。如果我丢失了设备,则我的数据是安全的。但是,任何人只要拥有该USB记忆棒或我插入它的任何主机上的任何软件,都可以轻松更改他们想要在该驱动器上的任何(加密)数据。当然,没有密钥,更改将只是随机的,但可能仍会在一段时间内未被发现。
$ \ endgroup $
– JimmyB
16年11月4日15:30



$ \ begingroup $
@JimmyB我可能没有充分解释这种针对硬件设备的MITM攻击形式。小偷必须割断棍子,改变其内容(随机地或不随机地),然后将其物理地传递给您本来打算提供给它的人,以说服他们来自您。请记住,我们是在物理存储设备上谈论认证,而不是在传输中使用电子副本。
$ \ endgroup $
–Paul Uszak
16年11月4日在23:32

$ \ begingroup $
性能开销不可忽略。但是最大的问题确实是,当您不能确保完整性验证代码的完整性时,根本没有必要付钱。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年7月7日在1:49

#6 楼

为了在加密的文件系统中创建除垃圾扇区以外的任何内容,无论如何都需要密钥,因此只有很少的收获。

唯一的用例是要提供数据给应该阅读但不能修改的其他人。这仅在以下情况下有用:存储介质用完了,因此无法制作更多副本,想要将数据分发给应该轮流获取的多个人,数据在传输中需要加密,并且您不信任这些人之间不要在传递数据之前默默修改数据。

这不会留下太多的应用程序。用途。

评论


$ \ begingroup $
“为了在加密文件系统中创建除垃圾扇区以外的任何内容,无论如何都需要拥有密钥” –不,只是不。您不需要知道文件的内容就可以对其进行“有趣的”修改,例如,翻转特权/非特权位(以及破坏过程中不需要的其他数据)。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年11月7日,下午1:52

$ \ begingroup $
@Gilles,但是只要没有按键我所能做的就是翻转随机选择的位。如果有一个“特权”位,那么我有50%的机会翻转它,但是同时我还将更改第一个数据扇区的扇区地址,该地址存储在其旁边,从而使文件无用。没有密钥,我什至无法测试我刚刚做了什么。
$ \ endgroup $
–西蒙·里希特(Simon Richter)
16年11月7日在6:07



$ \ begingroup $
“难以置信” –不,这就是重点。如果文件恰好包含CRC,则可以,这会使攻击更加困难,但不一定是不可能的:只需要花费2 ^ 32次尝试就可以正确获得CRC32,这可能只需要几分钟的计算。您完全没有意识到攻击者不需要知道更改的块是什么,他们只需要正确处理其中的一小部分,就可以进行大量尝试。
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年11月7日在20:00

$ \ begingroup $
@SimonRichter在许多常用的加密模式中,可以翻转一位密文,并且可以确定地翻转了明文的特定一位。 CBC,CFB和CTR是我想到的头三个示例。在这两种模式中,翻转的位也会破坏附近的某些数据,但不会导致对手想要翻转的块。在CTR模式下,对手可以翻转任何所需的位,而不会破坏其他数据。
$ \ endgroup $
–卡巴斯德
16年11月8日在8:17

$ \ begingroup $
今天碰巧有一个关于此主题的问题:crypto.stackexchange.com/questions/41325/…
$ \ endgroup $
–吉尔斯'所以-不再是邪恶的'
16年11月8日在12:36