我想使用AWSKmsClient或AWSKmsClient结合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火花代码,然后用AWSKmsClient或者用Java的AWS加密SDK来解密它。
基于此链接,and和AWS似乎有一些不同:
AWS加密SDK并不意味着与aws kms命令行工具兼容。简而言之,AWS加密SDK利用KMS提供比KMS更多用途的加密功能。
我也不能用AWSKmsClient来做这件事,我是不是遗漏了什么?是否有更好的方法来实现这一点?
发布于 2019-04-25 19:11:16
我成功地使用了AWSKMSClient
import java.nio.charset.StandardCharsets
import com.amazonaws.services.kms.{AWSKMS, AWSKMSClientBuilder}
import com.amazonaws.services.kms.model.DecryptRequest
import java.nio.ByteBuffer
import com.google.common.io.BaseEncoding
object KMSUtils {
val keyId = "arn:aws:kms:us-east-1:{Account ID}:key/{KEY ID}"
def decrypt(base64EncodedValue: String): String = {
val kmsClient: AWSKMS = AWSKMSClientBuilder.standard.build
val textDecoded: ByteBuffer = ByteBuffer.wrap(BaseEncoding.base64().decode(base64EncodedValue))
val req : DecryptRequest = new DecryptRequest().withCiphertextBlob(textDecoded)
val plainText : ByteBuffer = kmsClient.decrypt(req).getPlaintext
val printable = StandardCharsets.UTF_8.decode(plainText).toString
return printable
}
}发布于 2019-04-24 21:25:24
这里的混乱在于直接通过AWS SDK使用AWS KMS和使用AWS加密SDK之间的区别。
使用KMS (或其他密钥提供程序)作为信封加密format1的一部分。因此,您引用的片段是正确的: AWS加密SDK的输出不能由KMS直接解密,反之亦然。
但是,所有AWS加密SDK实现都是相互兼容的。
如果您想加密CLI中的某些内容,您可以传递给Java/JVM代码进行解密,这在AWS加密SDK和AWS加密SDK中是绝对可能的。
来源:我为Python2和CLI3编写了advised,并为C4和我们的documentation5提供了advised的建议。
至于为什么不能使用AWSKmsClient解密从使用AWS直接调用KMS中接收到的值,根据收到的错误有多种可能性。
一种可能是您可能没有CMK上的Decrypt权限。这应该会导致来自KMS的权限错误。
另一种可能是,您正在提供无效的密文。AWS会自动对从KMS接收到的CiphertextBlob二进制数据进行编码,然后再返回它,因为大多数shell都不能很好地处理二进制数据。但是,AWSKmsClient在发送到KMS之前不会自动对任何内容进行base64 64解码。您必须提供原始字节。因此,如果您在解密请求中将base64 64编码的字符串提供给AWSKmsClient,那么KMS将抛出一个错误,您提供了无效的密文。
发布于 2019-04-24 15:44:29
“AWS加密SDK的所有特定语言实现,包括AWS加密CLI,都是可互操作的。”引用自aws博士。因此,您的问题正文中缺少的链接必须包含虚假信息。
在文档中有一些基本的例子。使用您的密钥id输入KmsMasterKeyProvider应该会为您完成此操作。
为什么不直接将加密部分封装在使用AWS加密SDK的java程序中,这样就不必担心‘互操作性’了?
https://stackoverflow.com/questions/55818500
复制相似问题