如何使用 Java 或 AWSKmsClient 使用 AWS 加密开发工具包解密 AWS KMS 密码

Am1*_*3zA 0 java encryption scala amazon-web-services amazon-kms

我想使用 AWSKmsClient 或 AWS Encryption SDK with Java 来解密我使用以下方法加密的消息AWS CLI

我使用以下方法创建了一条加密消息:
aws kms encrypt --key-id 123421-4032-412c-4321-eds42d1a1b432 --plaintext MyText --output text --query CiphertextBlob
它为我生成了类似这样的内容: ADCCAHhJotXoy8910T/Pd8PXVaF/Xkg+9NrF9QTy/XlW7rTtUAH6zACj9MbEY1cS7526GfscAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZDEEAS4wEQQMGmYHb67SV66h/eE0AgEQgCONMNda4kVsSi9sPAXXts2F0N/mwjSlIB2ngJcAyxymnltrHQ==

我想将其传递给我的 scala-spark 代码并使用 AWSKmsClient 或 AWS Encryption SDK with Java 对其进行解密。

根据此链接, AWS Encryption SDK 和 AWS KMS 之间似乎存在一些差异:

适用于 Java 的 AWS 加密开发工具包并不与 aws kms 命令行工具兼容。简而言之,AWS 加密 SDK 利用 KMS 提供比单独使用 KMS 更通用的加密功能

我也无法使用 AWSKmsClient 来完成此操作,我是否遗漏了什么?有更好的方法来实现这一目标吗?

mat*_*aws 6

这里的混淆归结为直接通过 AWS 开发工具包使用 AWS KMS 与使用 AWS 加密开发工具包之间的区别。

AWS 加密 SDK 使用 KMS(或其他密钥提供程序)作为信封加密格式的一部分[1]。因此,您引用的代码片段是正确的:AWS Encryption SDK 的输出无法直接由 KMS 解密,反之亦然。

但是,所有 AWS 加密 SDK 实现相互兼容

如果您希望对 CLI 中的某些内容进行加密,并将其传递给 Java/JVM 代码进行解密,那么使用 AWS 加密开发工具包 CLI 和适用于 Java 的 AWS 加密开发工具包绝对可以实现这一点。

来源:我编写了适用于 Python[2] 和 CLI[3] 的 AWS 加密开发工具包,并就适用于 C[4] 的 AWS 加密开发工具包以及我们的文档 [5] 提供了建议。


至于为什么不能使用AWSKmsClient解密使用 AWS CLI 直接调用 KMS 收到的值,有多种可能性,具体取决于您收到的错误。

一种可能性是您可能没有DecryptCMK 的权限。这应该会导致 KMS 出现权限错误。

另一种可能性是您提供了无效的密文。AWS CLICiphertextBlob在返回从 KMS 接收的二进制数据之前自动对其进行 base64 编码,因为大多数 shell 不能很好地处理二进制数据。但是,AWSKmsClient在将任何内容发送到 KMS 之前,不会自动对任何内容进行 Base64 解码。您必须提供原始字节。因此,如果您将 base64 编码的字符串提供给AWSKmsClient,那么 KMS 将抛出您提供的密文无效的错误。

[1] https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html

[2] https://aws-encryption-sdk-python.readthedocs.io/en/latest/

[3] https://aws-encryption-sdk-cli.readthedocs.io/en/latest/

[4] https://github.com/awslabs/aws-encryption-sdk-c

[5] https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html