如何使用Java中的AWS KMS CMK和数据密钥实现数据加密和解密?

时间:2018-04-10 21:40:38

标签: encryption aws-kms amazon-kms

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

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

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

  1. 我需要在我的AWS账户中拥有CMK。我创建了一个在我的帐户中创建的AWS管理的CMK。
  2. 请注意我从控制台获取的CMK的密钥ID或别名。
  3. 通过传递KeyID或Alias和KeySpec来创建GenerateDataKeyRequest对象。
  4. 使用awskmsClient.generateDataKey()方法生成数据密钥,并传递上述GenerateDataKeyRequest对象。
  5. 上面的步骤将为我提供GenerateDataKeyResult对象,该对象具有"明文"和" ciphertextblob"数据密钥的值。
  6. 我的代码如下:

    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. 使用以上"明文"数据密钥用于解密数据。

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

      1. 存储加密数据的最佳方法是什么?" ciphertextblob "数据库中的数据键?

      2. 如何获得" 明文"数据密钥来自存储的" ciphertextblob"数据键?

      3. 最后,如何使用"明文"解密我的数据?数据密钥我在上面的步骤中得到了什么?

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

        谢谢。

2 个答案:

答案 0 :(得分:2)

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

您应该使用AWS Encryption SDK并且不必担心这些问题:)

可以找到示例代码here

答案 1 :(得分:1)

  

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

您可以使用默认加密功能,因为我看到您正在使用Java,您可以查看my encryption blog

  

然后文档还说要存储加密数据和" ciphertextblob"数据密钥。这在AWS KMS术语中称为信封加密。我无法弄清楚我该怎么做。在这方面的任何帮助将受到高度赞赏。

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

" ciphertextblob"数据密钥稍后将用于从kms请求普通加密密钥,以便您可以解密数据

  

根据文档,我们需要采取以下步骤进行解密:
  使用存储的" ciphertextblob"获取"明文"的数据键数据密钥。
  使用上面的"明文"数据密钥解密数据。

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

  

存储加密数据的最佳方法是什么?" ciphertextblob"数据库中的数据键?

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

  

我如何获得"明文"数据密钥来自存储的" ciphertextblob"数据键?

调用decrypt()操作 - 它从" ciphertextblob"

返回普通数据加密密钥
  

最后,我如何使用"明文"解密我的数据?数据密钥我在上面的步骤中得到了什么?

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