0

我使用Amazon Encryption SDK在将数据存储到数据库之前对其进行加密。我也在使用Amazon KMS。作为加密过程的一部分,SDK 将用于加密的数据密钥的密钥提供者 ID存储在生成的密文头中。

如此处的文档所述http://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html#header-structure

AWS 加密 SDK 中的加密操作返回包含加密数据(密文)和所有加密数据密钥的单个数据结构或消息。要理解这种数据结构,或者构建读取和写入它的库,您需要了解消息格式。

消息格式至少由两部分组成:标头和正文。在某些情况下,消息格式由第三部分组成,即页脚。

Key Provider ID 值包含 AWS KMS 客户主密钥 (CMK) 的 Amazon 资源名称 (ARN)。

这就是问题所在。现在我有两个不同的 KMS 区域可用于加密。每个密钥提供者 ID 都具有完全相同的加密数据密钥值。所以任何一个密钥都可以用来解密数据。但是,问题在于密文标头。假设我有 KMS1 和 KMS2。如果我使用 KMS1 提供的密钥对数据进行加密,那么密钥提供者 ID 将存储在密文头中。如果我尝试使用 KMS2 解密数据,即使加密数据密钥相同,解密也会失败,因为标头不包含 KMS2 的密钥提供程序。它具有 KMS1 的密钥提供程序 ID。它失败并出现此错误:

com.amazonaws.encryptionsdk.exception.BadCiphertextException: Header integrity check failed.
        at com.amazonaws.encryptionsdk.internal.DecryptionHandler.verifyHeaderIntegrity(DecryptionHandler.java:312) ~[application.jar:na]
        at com.amazonaws.encryptionsdk.internal.DecryptionHandler.readHeaderFields(DecryptionHandler.java:389) ~[application.jar:na]
 ...
com.amazonaws.encryptionsdk.internal.DecryptionHandler.verifyHeaderIntegrity(DecryptionHandler.java:310) ~[application.jar:na]
        ... 16 common frames omitted
Caused by: javax.crypto.AEADBadTagException: Tag mismatch!

它无法验证标头完整性并失败。这不好,因为我计划拥有多个 KMS,以防一个区域的 KMS 出现故障。我们在所有地区复制我们的数据,并且我们认为只要加密的数据密钥匹配,我们就可以使用来自这些地区的任何 KMS 进行解密。但是,看起来我只能使用加密数据的原始 KMS?如果我们只能依赖一个 KMS,我们究竟如何将其扩展到多个区域?

我可以在调用中包含所有区域主密钥来加密数据。这样,标题将始终匹配,尽管它不会反映它实际使用的 KMS。但是,这也是不可扩展的,因为我们将来可以添加/删除区域,这会导致所有已经加密的数据出现问题。

我错过了什么吗?我已经考虑过这一点,我想在不破坏 SDK/加密提供的任何完整性检查的情况下解决这个问题。

更新:

基于@jarmod 的评论

使用别名也不起作用,因为我们只能将别名与区域中的键相关联,并且它存储了它所指向的键 ARN 的解析名称。

我正在阅读这份文件,上面写着

此外,信封加密可以帮助您设计灾难恢复应用程序。您可以在区域之间按原样移动加密数据,并且只需使用特定于区域的 CMK 重新加密数据密钥

但是,这根本不准确,因为重新加密的数据密钥的 Key Provider ID 将完全不同,因此加密 SDK 在不同的区域将无法解密!

4

1 回答 1

0

抱歉,因为我不熟悉 Java 编程,但我相信您如何使用 KMS CMKs 使用来自多个区域的密钥来加密(或解密)数据用于 DR。

当您使用多个主密钥加密明文时,可以使用任何一个主密钥来解密明文。请注意,只有一个主密钥(比如 MKey1)生成用于加密数据的明文数据密钥。然后这个明文数据密钥也被另一个主密钥(MKey2)加密。

结果,您将拥有加密数据 + 加密数据密钥(使用 MKey1)+ 加密数据密钥(使用 MKey2)。

如果由于某种原因 MKey1 不可用,而您想解密密文,可以使用 SDK 使用 MKey2 解密加密的数据密钥,它可以解密密文。

所以,是的,如果你想使用多个 KMS,你必须在你的程序中指定多个 KMS CMK ARN。您共享的文档也有一个示例,我相信您知道。

于 2017-11-19T09:46:42.237 回答