在应用服务器和密钥服务器之间交换 DEK 和 KEK(加密密钥)

信息安全 加密 密码学 网络 密钥管理
2021-09-10 07:21:40

在我的应用程序中,需要在将用户数据插入 mysql 数据库之前对其进行加密。我正在使用 AES 算法使用 256 位散列加密数据(并将其称为数据加密密钥,简称 DEK)。

为了使系统更安全,DEK 不是以纯文本形式存储在应用服务器中,而是以加密形式 (en_dek) 存储在应用服务器中。加密 DEK 的密钥存储在一个完全独立的服务器中,称为密钥加密密钥 (KEK)。因此,每次要加密/解密数据时,首先使用 KEK 来解密 en_dek,这给了我实际的 DEK,然后使用这个 DEK 来加密/解密用户的数据。

现在我的问题是:

[1] 我应该将 (en_dek + data) 发送到密钥服务器还是应该将 KEK 获取到应用程序服务器?哪种做法更安全?

[2] 这两种方法都有一个缺陷,如果攻击者能够访问其中任何一个服务器,他就会同时了解 KEK 和 DEK。我们怎样才能防止这种情况发生?

[3] 当我们谈到密钥轮换时,两个密钥(DEK 和 KEK)中的哪一个是轮换的?

1个回答

我应该将 (en_dek + data) 发送到密钥服务器还是应该将 KEK 提取到应用程序服务器中?哪种做法更安全?

将密钥发送en_dek到密钥服务器进行处理几乎是硬件安全模块在高级别的工作方式。这种方法的优点是密钥材料从不接触应用程序服务器。因此,应用程序服务器的任何妥协都只能解密当前在内存中的密钥,并可能向密钥服务器提交解密请求。但是,攻击者不会自动获得对主密钥本身的访问权,这很重要。

鉴于您已经在谈论将数据发送到另一个系统进行解密,我想知道简单地发送数据是否会更好,从而完全对应用程序服务器隐藏密钥?

在任何这样的方案中,密钥的安全性完全取决于存储它的服务器或 HSM 的安全性。通常,真正的 HSM 相当擅长保护密钥,除非您对电子设备非常方便。

这两种方法都有一个缺陷,如果攻击者能够访问其中任何一个服务器,他就会同时了解 KEK 和 DEK。我们怎样才能防止这种情况发生?

你不能,除非使用专用的 HSM,这基本上就是你正在讨论的构建。我会简化方案,将密钥保存在仅专用于加密操作的服务器上,并锁定该服务器。

有关这两点的更多信息,请参阅OWASP 加密存储规则

当我们谈论密钥轮换时,两个密钥(DEK 和 KEK)中的哪一个是轮换的?

理想情况下,两者兼而有之。旋转 KEK 应该更容易,因为 DEK 的大小是固定的,不应该有那么多。如果您要加密大量数据,则轮换 DEK 可能会更加困难。

从 OWASP 页面,它比我说得更好:

重新加密是指解密数据然后用新密钥重新加密的过程。定期更新数据有助于保护其免受旧密钥未检测到的损害。适当的密钥更新周期取决于密钥的安全性。受专用硬件安全模块中的密钥保护的数据可能只需要每三年更新一次密钥。受拆分并存储在两个应用程序服务器上的密钥保护的数据可能需要每年更新密钥。