区域

时间:2017-11-18 23:00:52

标签: amazon-web-services aws-sdk encryption-symmetric amazon-kms aws-regions

在将数据存储到数据库之前,我使用Amazon Encryption SDK加密数据。我也使用Amazon KMS。作为加密过程的一部分,SDK会在生成的密文标题中存储用于加密的数据密钥的密钥提供程序ID

如此处的文档[{3}}

所述
  

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

     

消息格式至少由两部分组成:标题和   身体。在某些情况下,消息格式包含第三部分,a   页脚。

密钥提供商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的已解析名称。

我正在阅读http://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html#header-structure

  

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

然而,这根本不准确,因为加密SDK无法在不同的区域解密,因为重新加密的数据密钥的密钥提供者ID将完全不同!

1 个答案:

答案 0 :(得分:0)

道歉,因为我不熟悉Java编程,但我相信你如何使用KMS CMK来使用来自多个区域的密钥来加密(或解密)数据,这是很困惑的。

当您使用多个主密钥加密明文时,可以使用任何一个主密钥来解密明文。注意,只有一个主密钥(让我们说MKey1)生成用于加密数据的明文数据密钥。然后,该明文数据密钥也由另一个主密钥(MKey2)加密。

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

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

所以,是的,如果要使用多个KMS,则必须在程序中指定多个KMS CMK ARN。您共享的文档也有example,我确信您知道。