按部分加密数据与加密整个数据

信息安全 密码学 加密 文件加密
2021-09-01 07:58:51

假设我有一个包含记录的文件,并且我有两个选项来加密它:

  • 将文件作为一个整体加密
  • 分别加密每条记录并将它们存储在一起。

哪种方式通常更可取,为什么?

例如,我认为第二种方法更糟糕,因为天真地实施它会泄露有关记录数量和大小的信息。但是如果我在每条记录的末尾添加一些随机数据呢?

4个回答

在加密之前,您必须首先定义您想要获得什么样的属性,以及假定的攻击者可能使用的路径是什么。

加密是获得机密性的工具。大多数安全模型还需要某种受控的完整性检查(“只有被动的”攻击者非常少见)。有一些加密模式结合了加密(用于机密性)和验证完整性,请参阅EAXGCM每记录加密意味着以下内容:

  • 记录泄漏的数量和大小。
  • 不再保证完整文件的结构完整性:主动攻击者可以删除一些记录,或更改它们的顺序,而不会被发现。
  • 有一个大小开销。每个单独的加密都有一个固定大小的开销,这取决于加密模式(完整性检查和称为Initialization Vector的基本参数需要这个开销)。每条记录的开销比整个文件的单个开销需要更多的空间。
  • 可以在不处理整个文件的情况下验证单个记录的完整性。
  • 它很复杂。

最后一个结果应该被视为使用按记录加密的一个令人信服的理由:复杂性是安全工程师最大的敌人。因此,除非您确实需要以部分块的形式处理文件(即文件太大而无法在 RAM 中作为一个整体进行解密和检查),否则您应该避免尝试实现按记录加密。

很大程度上取决于您想对数据做什么,以及您对带宽等的要求。

正如您所说,使用您的第二个选项,数据泄漏将围绕文件的数量和大小发生,但这可能不是问题,并且文件访问可能会更快。

话虽如此,但大多数卷加密解决方案都会加密整个卷,并且在磁盘访问不是瓶颈的情况下,这可能是适合您的解决方案。

在安全级别要求对文件进行加密的环境中,我的偏好是加密整个卷,因为这有助于消除意外以明文形式保存文件的可能性,并减少数据泄漏。

第二种方法并不幼稚,因为您提到的原因是,只要不破坏块大小,加密就会提供相同大小的加密文本。基本上,如果输入是 2 字节或 16 字节,则输出将是 AES-128 中的 128 位,假设您将填充输入以使其达到块大小。但是这种方法很容易泄露记录的数量。

第二种方法幼稚的原因是因为它涉及更多的 I/O 操作。但如果你有资源,那是没有问题的。此外,当加密像 AES 一样非常强大时,这种方法几乎不是问题。唯一需要担心的是,当它们可以容纳在单个文件的 50 行中并且可以更快地加密/解密时,单独加密 1000 个字段所花费的时间。

选择权交给了你。两者都很强,第二个在揭示记录数量方面有点弱。否则,在这种情况下,只有外部参数(如可用于加密/解密的时间)计数。

加密函数(分组密码)不能接受任意长度的输入。因此,即使您对整个文件进行加密,加密功能本身也会将其分成块并单独加密这些块。这类似于加密单个记录,除了操作模式将决定这些块是否/如何相互混合。

通过单独加密每条记录,您正在执行类似于 ECB 操作模式的操作。不同之处在于您自己对数据进行了分区。这保留了有关结构的信息,任何针对 ECB 的攻击也将适用于单独加密记录的方法(没有随机填充)。例如,如果两条记录相同,您将能够在密文中看到。

此外,通过单独加密每条记录,您不会完全填充块,这在速度和存储方面会降低效率。

所以简短的回答是:最好加密整个文件并使用良好的操作模式(例如 CBC 或 XTS)。

您考虑不加密整个文件的唯一原因是您需要有选择地有效地解密记录或替换记录。加密整个文件意味着获取记录,您需要将整个文件解密到您感兴趣的记录。更改单个记录的任何部分意味着重新加密其余数据。如果这是一个问题,有标准的方法来进行逐个扇区的加密。