Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java AWS SDK中解密数据密钥会产生乱码_Java_Encryption_Bytebuffer_Aws Kms - Fatal编程技术网

在Java AWS SDK中解密数据密钥会产生乱码

在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

所以我一直在读,读,看例子,然后…惨败。我的情况如下:

我有一个以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-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);