2017-10-02 18 views
0

私は読んで読んでいて、例を見ています。ここに私の状況です:私はKMSでCMKを持ってJava AWS SDKのデータキーを復号化すると、わかりにくくなります

と私はそうのように、データキーを生成した:

$ aws kms decrypt --ciphertext-blob fileb://<(echo 'AQIDAHgrvfqfgn9D0tTUJOISzFCz7ejMPZ6/HGX0kGAlzKYZ7wEiyHdpuGaOjpq4UQazPAgeAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMU5JtbI6lxLOv/p4KAgEQgDsX97Pk+ywqLU2VymLRgDSz0exOyzRgLMgd7WEf3sLUh4GnbYllIrxNSdK/DSZrYUhBo78KYugnkTj89g==' | base64 -d) --query Plaintext 
"+SjeaxtD5TIhOcY16+A2NA493MbxnYozbzZx4i3/BfA=" 

$ 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から復号化することにより、それを検証します見よ。私はPlaintextの値をすべて素敵で清潔に戻します。私は、次のコードでJavaを使用してSDKを通じて、同じ暗号文ブロブを挽くしよう:

. 
    . 
    . 
    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�-�� 

私はすべてで結果を符号化しようとしましたCharsetは私に利用可能で、CharsetはオリジナルのPlaintextキーを生成しません。私が見たすべての例からわかるように、私のコードは正しいです。だから私は何が間違っているか、私はここで何が欠けているのですか?私が望むのは、 "+ SjeaxtD5TIhOcY16 + A2NA493MbxnYozbzZx4i3/BfA ="を含むJava String変数で終わることだけです。

+0

ます( 'StandardCharsets.UTF_8.decodeを試すことができますキー).toString() '' ByteBuffer key'を 'String'に変換しますか? –

+0

あなたのコードの他の部分には何の問題もありません。もし存在すれば、KMSクライアント自体は捨て去ってしまいました。 –

+0

新しい文字列(bytes、Charset.forName( "UTF-8") ')を運行しないで試しましたが、私はあなたの提案を試してみます。 – RobA

答えて

0

私は自分の解決策を見つけました:私はとても閉鎖されました!上記のコードで、KMSから返された同じプレーンテキスト値を抽出するために必要なことと、データキーを生成するときにaws-cliコマンドラインで受け取ったASCII文字列は、バイト配列を取り、Base64でエンコードすることです。だから私のサンプルコードは

String result = new String(bytes); 

はこのようなもので...の行を置き換える、上部に、上記のすべての方法を参照:

String result = Base64.getEncoder().encodeToString(bytes); 
関連する問題