Как расшифровать шифр AWS KMS с помощью AWS Encryption SDK с использованием Java или AWSKmsClient - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу использовать 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, я что-то упустил?Есть ли лучший способ добиться этого?

Ответы [ 3 ]

1 голос
/ 25 апреля 2019

Путаница здесь заключается в разнице между использованием 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 и AWSEncryption SDK для Java.

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


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

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

Другая возможность - предоставление неверного зашифрованного текста.CLI 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 / ru / latest /

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

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

0 голосов
/ 25 апреля 2019

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

}
0 голосов
/ 24 апреля 2019

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

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

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

...