加密密钥轮换究竟是如何工作的?我知道出于安全目的不断轮换加密密钥是一种非常好的做法,但轮换密钥需要做太多的工作。
案例:
假设我有一个存储30GB数据的数据库,我们在休息时使用内部密钥加密数据,我计划每个月轮换我的密钥。
问题:
- 这是否意味着我的所有数据都将每月用旧密钥解密并用新密钥重新加密
- 整个加密-解密将花费大量的时间和计算资源
- 如果我的数据库(或任何加密数据集)明天扩展,这是否意味着当我的密钥旋转时,相同的过程会重复?这看起来不像是一个可扩展的解决方案
其他详细信息:
- 我也见过AWS KMS旋转它的关键点,如果我们选择了旋转选项。AWS是如何为所有底层服务轮换其密钥和所有加密数据的
您需要熟悉Envelope Encryption
。每次您想在AWS中加密数据时,首先要生成一个唯一的数据密钥。然后使用此密钥加密数据。这个键不是旋转的键!
然后,您获取这个密钥,并使用KMS的密钥对其进行加密。现在,如果您想解密此数据,您必须首先获得解密的数据密钥,并且要解密此数据密钥,您将需要KMS密钥。
现在,如果你想轮换密钥,你不需要重新加密所有数据,相反,你需要使用从KMS轮换的密钥解密数据密钥,然后获得一个新密钥,并重新加密未加密的数据密钥。这样就不需要重新加密所有数据。
这里有两个重要的链接可以帮助您理解AWS中的信封加密和密钥旋转。
- https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html
- https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html
我从上面的链接中引用了一些重要的概念:
信封加密:
加密数据时,数据受到保护,但必须保护加密密钥。一种策略是加密它。信封加密是用一个数据密钥加密明文数据,然后用另一个密钥加密数据密钥的做法。
客户主密钥
CMK是在AWS KMS中创建的。对称CMK和非对称CMK的私钥从未使AWS KMS未加密。此策略不同于数据键。AWS KMS不存储、管理或跟踪您的数据密钥。您必须在AWS KMS之外使用它们。
数据密钥
数据密钥是可用于加密数据的加密密钥,包括大量数据和其他数据加密密钥。您可以使用AWS KMS客户主密钥(CMK)生成、加密和解密数据密钥。但是,AWS KMS不会存储、管理或跟踪您的数据密钥,也不会使用数据密钥执行加密操作。您必须在AWS KMS之外使用和管理数据密钥。
密钥轮换
当您为客户管理的CMK启用自动密钥轮换时,AWS KMS每年都会为CMK生成新的加密材料。AWS KMS还永久保存了CMK的旧加密材料,以便用于解密其加密的数据。在删除CMK之前,AWS KMS不会删除任何旋转的密钥材料。
密钥轮换中的一个重要概念是HSM备份密钥(HBK):(https://docs.aws.amazon.com/kms/latest/cryptographic-details/key-hierarchy.html)
在特定CMK的层次结构中,HBK可以被认为是CMK的一个版本。当您想通过AWS KMS旋转CMK时,会创建一个新的HBK,并将其作为CMK的活动HBK与CMK关联。较旧的HBK被保留下来,可用于解密和验证以前受保护的数据。但是只有激活的加密密钥才能用于保护新信息。
Does that mean all my data will be decrypted by the old key and re-encrypted by the new one every month?
正如已经回答的那样,简单的答案是否定的。但之前的答案没有达到密钥轮换的目的
密钥轮换背后的原因是限制由单个密钥加密的数据量。
How does AWS manage to rotate it's keys and all encrypted data for all the underlying services?
基本思想(至少在KMS中)是,KMS密钥不是单个密钥,而是一组密钥,最后一个密钥是当前密钥。你可以想象;密钥版本控制";。每次密钥轮换后,都会保存当前密钥,这样您仍然可以解密之前加密的密文(数据密钥-如其他答案中所述)。我相信在KMS中,这整个集合是隐藏的,但Azure KeyValt将整个集合显示为密钥版本。
The whole encryption-decryption would take a lot of time and compute resources
不,你什么都不用做。AWS管理";关键版本";为你。即使你按照另一个答案中的建议重新加密信封密钥,那么你实际上也无法实现密钥轮换的目的。
KSM生成的密文也必须包含密钥版本的一些标识,因此即使在密钥旋转之后,KMS也能够解密密文。