分层密钥轮换。我应该旋转最低级别的键吗?
NIST 认为您应该这样做。
NIST SP800-57 第 1 部分“密钥管理建议(第 1 部分 - 常规)”列出了加密密钥及其管理的定义和建议。根据针对特定密钥类型的§5.3.6 Cryptoperiod 建议,它涵盖了 DEK:
- 对称数据加密密钥:
一个。类型注意事项:对称数据加密密钥用于保护存储的数据、消息或通信会话。主要基于妥协的后果,用于在短时间内加密大量数据(例如,用于链路加密)的数据加密密钥应该具有相对较短的发起者使用期。随着时间的推移,用于加密较少数据的加密密钥可能具有较长的发起者使用期。对称数据加密密钥的发起者使用期限适用于使用该密钥来加密信息(参见第 5.3.5 节)。
带有建议加密周期的表 1说:
| 密钥类型 | (Cryptoperiod) 发起者-使用期 (OUP) | (Cryptoperiod) 接收者使用期 |
|---|---|---|
| 6. 对称数据加密密钥 | <= 2 年 | <= OUP + 3 年 |
是的,在轮换 DEK 时,重新加密成为生命周期的一部分。维护多个 DEK 可以让您中断重新加密,而不是被迫一次重新加密整个数据集。
这完全取决于您的威胁模型。
最终,您的 DEK 是关键——如果有人拥有您的数据和您的 DEK,那么游戏就结束了。此外,如果有人可以访问您的数据和 DEK,那么轮换所有其他密钥将无关紧要。
尽管如此,只有您可以决定是否值得旋转 DEK。因此,问题是:您的威胁模型是什么?您首先尝试通过引入 3 层密钥来缓解哪些威胁?大概你的问题可以通过简单地考虑你为什么首先这样做来回答。
这没有什么帮助
首先,它有助于记住这不能防止的威胁。如果攻击者获得对您正在运行的应用程序的访问权限,这些都无济于事。您的应用程序将有权访问数据和 DEK,因此无论您使用多少层密钥,您都会感到很紧张。
这可能有什么帮助
可能轮换 DEK 的主要影响是防止丢失备份/旧数据(这种情况比您想象的要多)。如果有人找到旧的备份,也可以找到当前的 DEK,并且 DEK 从未旋转过,那么游戏结束。
如果有人找到旧的备份,但 DEK 已被轮换,旧的被丢弃,那么备份中的数据实际上是无用且不可恢复的(在这种情况下这是一件好事)。这可能与防止内部威胁特别相关。想象一个开发人员将一些数据的副本作为他们工作的正常部分(也许他们试图用一些真实的数据填充测试数据库?),并且还可以访问 DEK。即使内部人员没有恶意,这些数据可能会在他们的硬盘上保存几年,被遗忘,直到错误的恶意软件/黑客出现并从他们的机器上抢走所有东西。
旋转 DEK 可能有更多优势,但这是首先想到的。是否还有其他优势,是否值得您努力,这些都是只有您才能决定的问题。
首先,您应该有一个清晰的威胁模型和您选择的理由:为什么要使用三层加密密钥?为什么不是两个或二十个?为什么要轮换钥匙?您希望如何存储数据?
其次,轮换 DEK 不一定需要(立即)重新加密许多数据块。
选项 A 是更改 DEK,生成新的 KEK、DEK 并重新加密所有数据。这可能是你的想法。
但是,还有其他可能性:
选项 B 将生成一个新的 MK,重新加密其所有 KEK,让 KEK(及以下)在其设计的轮换时间进行更改。
选项 C 是,在生成新的 MK 时,在其块内加密旧的 MK。KEK 可以包含一个序列号(或者简单地说,一个随机 id)标识用于保护它的 MK(或者,您可以简单地尝试使用每个 MK 解密它们,直到找到一个可以正确解密的东西。您确实有类似HMAC(或 AEAD 模式)来验证密钥块的解密是否正确,对吗?)。
虽然可能对验证目的有用,但使用算法 X 用随机密钥 A 解密一个块,用相同的算法 X 用随机密钥 B 重新加密它,只是为了它,似乎并不需要......
