Как расшифровать шифр AWS KMS с помощью AWS Encryption SDK с помощью Java или AWSKmsClient

#java #scala #amazon-web-services #encryption #aws-kms

#java #scala #amazon-веб-сервисы #шифрование #amazon-kms

Вопрос:

Я хочу использовать AWSKmsClient или AWS Encryption SDK с 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-spark и расшифровать его либо с помощью AWSKmsClient, либо AWS Encryption SDK с Java.

Основываясь на этой ссылке, кажется, есть некоторая разница между AWS Encryption SDK и AWS KMS :

Пакет AWS Encryption SDK для Java не предназначен для совместимости с инструментом командной строки aws kms. Короче говоря, AWS Encryption SDK использует KMS для обеспечения более универсальной функциональности шифрования, чем только KMS

Мне также не удается сделать это с помощью AWSKmsClient, я что-то упускаю? есть ли лучший способ добиться этого?

Комментарии:

1. And I can not manage to do it with AWSKmsClient either есть еще подробности, почему вы не можете расшифровать зашифрованный текст с помощью клиента kms?

Ответ №1:

Путаница здесь сводится к разнице между использованием AWS KMS напрямую через AWS SDK и использованием AWS Encryption SDK.

AWS Encryption SDK использует KMS (или других поставщиков ключей) как часть формата шифрования в конверте [1]. Из-за этого приведенный вами фрагмент является правильным: выходные данные AWS Encryption SDK не могут быть расшифрованы KMS напрямую, и наоборот.

Однако все реализации AWS Encryption SDK совместимы друг с другом.

Если вы хотите зашифровать что-то из CLI, что вы можете передать в Java / JVM-код для расшифровки, это определенно возможно с помощью AWS Encryption SDK CLI и AWS Encryption SDK для Java.

Источник: Я написал AWS Encryption SDK для Python [2] и CLI [3] и консультировал по AWS Encryption SDK для C [4], а также по нашей документации [5].


Что касается того, почему вы не могли использовать AWSKmsClient для расшифровки значения, полученного при использовании AWS CLI для прямого вызова KMS, существует множество возможностей в зависимости от того, какую ошибку вы получили.

Одна из возможностей заключается в том, что у вас может не быть Decrypt разрешений на CMK. Это должно было привести к ошибке разрешений от KMS.

Другая возможность заключается в том, что вы предоставляете недопустимый зашифрованный текст. Интерфейс командной строки AWS автоматически кодирует на основе base64 CiphertextBlob двоичные данные, которые он получает от KMS, перед их возвратом, поскольку большинство оболочек плохо обрабатывают двоичные данные. Однако, AWSKmsClient не будет автоматически base64-декодировать что-либо перед отправкой в KMS. Вы должны предоставить необработанные байты. Итак, если вы предоставляете строку в кодировке base64 AWSKmsClient в запросе на расшифровку, KMS выдаст сообщение об ошибке, что вы предоставили неверный зашифрованный текст.

[1]https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/message-format.html

[2]https://aws-encryption-sdk-python.readthedocs.io/en/latest

[3] https://aws-encryption-sdk-cli.readthedocs.io/en/latest

[4]https://github.com/awslabs/aws-encryption-sdk-c

[5]https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/introduction.html

Ответ №2:

Мне удалось использовать 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
  }

}
  

Комментарии:

1. Где keyId используется?

Ответ №3:

«Все языковые реализации AWS Encryption SDK, включая AWS Encryption CLI, совместимы». цитируется из документов aws. таким образом, недостающая ссылка в теле вашего вопроса должна содержать ложную информацию.

в документации приведены основные примеры. Ввод KmsMasterKeyProvider с вашим идентификатором ключа должен сделать это за вас.

Почему бы вам просто не включить часть шифрования в программу Java, которая использует AWS Encryption SDK, чтобы вам не приходилось беспокоиться о «совместимости»?