代码之家  ›  专栏  ›  技术社区  ›  RobA

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

  •  0
  • RobA  · 技术社区  · 7 年前

    $ 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="
    

    瞧!我把明文值恢复得很好很干净。然后,我尝试使用Java通过SDK磨出相同的密文blob,代码如下:

        .
        .
        .
        final String encryptedCipherText = "AQIDAHgrvfqfgn9D0tTUJOISzFCz7ejMPZ6/HGX0kGAlzKYZ7wEiyHdpuGaOjpq4UQazPAgeAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMU5JtbI6lxLOv/p4KAgEQgDsX97Pk+ywqLU2VymLRgDSz0exOyzRgLMgd7WEf3sLUh4GnbYllIrxNSdK/DSZrYUhBo78KYugnkTj89g==";
        final String expectedPlainText = "+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA=";
    
        AWSKMS kmsClient;
        String returnValue;
    
        kmsClient = AWSKMSClientBuilder
                .standard()
                .withRegion("us-west-2")
                .build();
    
        ByteBuffer cipherTextBlob = ByteBuffer.wrap(Base64.getDecoder().decode(encryptedCipherText));
        DecryptRequest decryptRequest = new DecryptRequest().withCiphertextBlob(cipherTextBlob);
        ByteBuffer key = kmsClient.decrypt(decryptRequest).getPlaintext();
        final byte[] bytes = new byte[key.remaining()];
        key.duplicate().get(bytes);
        String result = new String(bytes);
        if (expectedPlainText.equals(result)) {
            LOG.info("decrypted plaintext matches expected");
        } else {
            LOG.error("decrypted plaintext unexpected value: " + result);
        }
        .
        .
        .
    

    转储的日志条目是:

    23:08:33.210 [main] ERROR com.eyefinity.magicmissile.aws.AwsClientConfig - decrypted plaintext unexpected value: �(�k�2!9�5��64=���3o6q�-��
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   RobA    7 年前

    String result = new String(bytes);
    

    比如:

    String result = Base64.getEncoder().encodeToString(bytes);