在Java AWS SDK中解密数据密钥会产生乱码
所以我一直在读,读,看例子,然后…惨败。我的情况如下: 我有一个以KMS为单位的CMK,并生成了一个数据密钥,如下所示:在Java AWS SDK中解密数据密钥会产生乱码,java,encryption,bytebuffer,aws-kms,Java,Encryption,Bytebuffer,Aws Kms,所以我一直在读,读,看例子,然后…惨败。我的情况如下: 我有一个以KMS为单位的CMK,并生成了一个数据密钥,如下所示: $ aws kms generate-data-key --key-id 64a62e3e-7e38-4f86-8ef2-3d00929e6260 --key-spec AES_256 { "Plaintext": "+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA=", "KeyId": "arn:aws:kms:us-w
$ aws kms generate-data-key --key-id 64a62e3e-7e38-4f86-8ef2-3d00929e6260 --key-spec AES_256
{
"Plaintext": "+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA=",
"KeyId": "arn:aws:kms:us-west-2:040512153658:key/64a62e3e-7e38-4f86-8ef2-3d00929e6260",
"CiphertextBlob": "AQIDAHgrvfqfgn9D0tTUJOISzFCz7ejMPZ6/HGX0kGAlzKYZ7wEiyHdpuGaOjpq4UQazPAgeAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMU5JtbI6lxLOv/p4KAgEQgDsX97Pk+ywqLU2VymLRgDSz0exOyzRgLMgd7WEf3sLUh4GnbYllIrxNSdK/DSZrYUhBo78KYugnkTj89g=="
}
然后,我通过从CLI解密来验证它:
$ aws kms decrypt --ciphertext-blob fileb://<(echo 'AQIDAHgrvfqfgn9D0tTUJOISzFCz7ejMPZ6/HGX0kGAlzKYZ7wEiyHdpuGaOjpq4UQazPAgeAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMU5JtbI6lxLOv/p4KAgEQgDsX97Pk+ywqLU2VymLRgDSz0exOyzRgLMgd7WEf3sLUh4GnbYllIrxNSdK/DSZrYUhBo78KYugnkTj89g==' | base64 -d) --query Plaintext
"+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA="
而转储出来的日志条目是:
23:08:33.210 [main] ERROR com.eyefinity.magicmissile.aws.AwsClientConfig - decrypted plaintext unexpected value: �(�k�2!9�5��64=���3o6q�-��
我尝试用我可用的每个字符集对结果进行编码,但没有任何字符集生成我的原始明文密钥。从我所看到的所有示例可以看出,我的代码是正确的。那么我做错了什么,或者我错过了什么?我只想得到一个Java字符串变量,它包含“+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA=”。我偶然发现了自己的解决方案:我太接近了!在上面的代码中,提取从KMS返回的相同纯文本值以及生成datakey时在aws cli命令行上接收到的ASCII字符串所需的全部工作就是获取字节数组并对其进行Base64编码。因此,请参考上面的示例代码,一直到顶部,替换以下行:
String result = new String(bytes);
比如说:
String result = Base64.getEncoder().encodeToString(bytes);
您能否尝试
StandardCharsets.UTF_8.decode(key).toString()
将字节缓冲键
转换为字符串
?因为我看不到您的代码的其他部分有任何问题。如果有,KMS客户端本身就会抛出。我尝试了新字符串(bytes,Charset.forName(“UTF-8”)
,但运气不佳,但我会尝试一下您的建议。16:02:40.885[main]ERROR com.eyefinity.magicmissile.aws.AwsClientConfig-解密的明文意外值:�(�K�2!9�5.��64=���3o6q�-��代码>不同的编码值,但仍然不是我想要的我越是认为问题在于存储在HeapByteBuffer中的响应值以及我试图将这些值转换回字符串的尝试。我可以从GeneratedTakey请求中看到HTTP响应,返回的值是我所期望的值,但是当我从result对象中取出它们并尝试将它们转换为字符串时,问题就出现了你们都乱七八糟的。
String result = Base64.getEncoder().encodeToString(bytes);