添加数据加密密钥然后将其与数据一起存储(加密)有什么好处

信息安全 加密 AES
2021-08-23 00:47:21

为了保护用户的敏感数据,我正在考虑以下两种方法:

  1. 为每个用户创建 1 个数据加密密钥 (DEK),使用它来加密(使用 AES CBC 模式,每次加密操作使用随机 IV)同一用户的所有数据。DEK 受到保护,并与数据分开存储。
  2. 使用多个 DEK,每次需要加密一条新的用户数据时使用 1 个(使用 AES/CBC 和上面的 IV)。然后使用与该用户对应的 KEK 对 DEK 进行加密,并与使用它加密的数据并排存储(例如,数据库中的同一行)。KEK 与数据和 DEK 分开安全存储。

AES/CBC 中是否存在具有良好随机 IV 的已知漏洞?第二种方法的好处是什么,除了最小化使用相同密钥加密的数据量,从而降低被密码分析的风险?

3个回答

我会给你一个具体的例子,说明何时/为什么将(加密的)密钥与数据一起存储是有意义的(我碰巧打开了选项卡以回答另一个问题,那为什么不呢?):

安卓全盘加密

简而言之:当您打开 Android 磁盘加密时,它会生成一个 AES-128 密钥,用于加密驱动器(称为主密钥)。然后它会获取您的模式/PIN/密码,并使用它来派生第二个 AES-128 密钥,用于加密主密钥并将其存储在磁盘上。您知道 Android 在启动过程中做的第一件事是询问您的 PIN 码/密码吗?那是因为它需要它来解密主密钥,以便它可以解密和挂载主文件系统。拥有两个 AES-128 密钥的原因是,如果您更改您的模式 / PIN / 密码,它只需要重新加密主密钥文件,而不是整个磁盘。

另一个很好的用例是传输中的数据,例如S/MIMEPGP

使用非对称密码(如 RSA)加密大量文本/附件数据确实很慢,所以我们所做的是使用随机密钥和 IV 使用 AES 加密批量数据,然后使用接收者的 RSA 公钥加密这些数据并附加加密的 AES 密钥和 IV 到按摩。

关于您的第 2 点:此选择的确切原因可能取决于特定的用例,但想到的一个优点是您可以向某人(例如审计员)透露一行的密钥而不会妥协表中的任何其他行。您还可以将数据发送给某人,而无需进行解密/重新加密的工作(如果数据很大,或者您有实时要求,则可以节省大量资金)。

最大的区别(我不会称其为好处)是,如果您对每条数据使用不同的随机密钥,则可以使用静态 IV 而不必为每条数据存储 IV。

但是,这不会为您提供比选项 1 更高的安全性,对每条数据使用相同的 DEK 和强随机 IV。

一个潜在的好处(有点牵强)是,如果数据是独立访问的,数据加密密钥(但不是主 KEK)的暴露只会暴露用该 DEK 加密的单个数据,并且没有其他数据。如果这对您来说是一个真正的威胁场景,那么选项 2 绝对是要走的路。如果不是,或者您可能需要同时或快速连续访问多条数据,那么选项 1 具有明显的好处。

您是否考虑过加密文件系统?它与您的第二个提案非常相似。

示例eCryptfs在 Unix 中和NTFS在 Windows 中的模式。AES其次,除了暴力破解之外,没有其他可行的破解方法;Serpent-256cipher 速度较慢,但​​没有已知的方法可以破坏多个数字。

至于为什么你会选择一个超过两个,这是因为一种叫做冷启动攻击的东西:如果黑客获得了使用加密驱动器的休眠计算机的访问权限,他可以使用另一台具有相同内存标准的计算机,将内存从冷却后的第一台计算机并将其放置在第二台计算机中,然后在它降级之前启动它。因此,他可以恢复您正在使用的任何文件的密钥,因此,如果您只有一个,则很容易解密硬盘驱动器,而使用单独的文件加密系统只会让黑客解密打开和运行的文件。

总之,除非您担心物理访问攻击,否则两者都将起作用。