1

我对 AWS 云环境比较陌生,所以我的知识总体上是有限的。如果这些是简单直接的问题并询问样本,我提前道歉。

我也在 SO 上环顾四周以获取更多信息,但找不到太多信息。也许我在寻找错误的东西。任何帮助将不胜感激。

我正在尝试使用AWS KMS来加密我的应用程序中的一个数据元素。阅读文档后,我的理解如下:

  1. 我需要在我的 AWS 账户中有一个 CMK。我已经在我的账户中创建了一个由 AWS 管理的 CMK。
  2. 记下我从控制台为我的 CMK 获得的 CMK 的密钥 ID 或别名。
  3. 通过传递 KeyID 或 Alias 和 KeySpec 创建一个 GenerateDataKeyRequest 对象。
  4. 使用 awskmsClient.generateDataKey() 方法生成数据密钥并传递上述 GenerateDataKeyRequest 对象。
  5. 上述步骤将为我提供 GenerateDataKeyResult 对象,该对象将具有 Data Key 的“plaintext”和“ciphertextblob”值。

我有如下代码:

AWSKMS awsKmsClient = AWSKMSClientBuilder.standard().build();
GenerateDataKeyRequest keyRequest = new GenerateDataKeyRequest()
        .withKeyId("alias/MyKeyAlias")
        .withKeySpec("AES_256");
GenerateDataKeyResult dataKeyResponse = awsKmsClient .generateDataKey(keyRequest );

System.out.println("Plaintext Data Key: " + dataKeyResponse.getPlaintext());
System.out.println("Ciphertext Data Key: " + dataKeyResponse.getCiphertextBlob());

文档说使用“明文”数据密钥加密我的数据并删除“明文”数据密钥。

我的第一个问题是:如何使用“明文”数据密钥加密我的数据?

我无法在文档中找到有关如何执行此操作的位置。或者使用哪个 API。AWSKMSClient 类中有一个“加密”方法,但只能与CMK 的 KeyID一起使用,而不能与数据密钥一起使用。还是我理解错了?

然后文档还说要存储加密数据和“ ciphertextblob 数据密钥。这在 AWS KMS 术语中称为信封加密。我无法弄清楚我该怎么做。在这方面的任何帮助将不胜感激。

根据文档,我们需要采取以下步骤来解密:

  1. 使用存储的“ciphertextblob”数据密钥获取“明文”数据密钥。

  2. 使用上述“明文”数据密钥解密数据。

我对此也有几个问题,如下所示:

  1. 在数据库中存储加密数据和“ ciphertextblob ”数据密钥的最佳方式是什么?

  2. 如何从存储的“ciphertextblob”数据密钥中获取“明文”数据密钥?

  3. 最后,如何使用在上述步骤中获得的“明文”数据密钥解密我的数据?

如果您能为上述问题提供示例代码,我将不胜感激。或者请给我指出正确的方向来实现上述目标。

谢谢你。

4

2 回答 2

2

您可以使用 Java Cryptography Extension (JCE) 来加密或解密数据。我不确定存储数据 ciphertextblob 数据密钥和加密数据的最佳方式是什么,但我相信它应该取决于您的应用程序和要求。要从ciphertextblob中获取明文数据密钥,需要调用KMS Decrypt API,即使用CMK对ciphertextblob数据密钥进行解密,得到明文数据密钥。

您应该使用AWS 加密 SDK,您不必担心这些问题 :)

示例代码可以在这里找到。

于 2018-04-11T06:44:55.557 回答
1

我的第一个问题是:如何使用“明文”数据密钥加密我的数据?

您可以使用默认加密功能,因为我看到您使用的是 Java,您可以查看我的加密博客

然后文档还说要存储加密数据和“ciphertextblob”数据密钥。这在 AWS KMS 术语中称为信封加密。我无法弄清楚我该怎么做。在这方面的任何帮助将不胜感激。

您存储您的密文(加密数据)和从 generateDataKey 操作返回的“ciphertextblob”数据密钥。如何存储数据取决于您(本地磁盘、S3、DB、其他服务......)。

“ciphertextblob”数据密钥稍后将用于从 kms 请求明文加密密钥,以便您可以解密数据

根据文档,我们需要采取以下步骤来解密:
使用存储的“ciphertextblob”数据密钥来获取“明文”数据密钥。
使用上述“明文”数据密钥解密数据。

事实上,解密操作从“密文块”返回纯数据加密密钥,因此您可以解密您的数据(再次 - 数据加密/解密完全取决于您,但强烈建议您使用一些安全标准,例如AES)

在数据库中存储加密数据和“ciphertextblob”数据密钥的最佳方式是什么?

请注意,加密数据是二进制的,因此您可以将它们视为已编码(例如 base64),因此恕我直言,最好的方法是将它们存储为文本(varchar)。

如何从存储的“ciphertextblob”数据密钥中获取“明文”数据密钥?

调用 decrypt() 操作 - 它从“ciphertextblob”返回纯数据加密密钥

最后,如何使用在上述步骤中获得的“明文”数据密钥解密我的数据?

再次,使用默认的加密功能:)

于 2018-04-12T08:33:22.743 回答