Как я могу вызвать функцию дешифрования Amazon AWS kms без использования двоичного файла?

У меня есть код, который извлекает строку, которая была зашифрована с помощью функции шифрования Amazon aws kms. Я хотел бы вызвать aws kms decrypt, чтобы вернуть незашифрованное значение, но я хотел бы сделать это, не записывая строку в двоичный файл. Все примеры, которые я нашел, предполагают, что вы конвертируете зашифрованное значение в кодировке base64 в двоичный файл, используя либо команду base64 linux, либо команду Certutil в Windows. Я пытаюсь сделать это в системе Windows. Мне кажется, у вас должна получиться запустить:

aws kms encrypt --key-id <mykey> --plaintext "mysecret"

Что для меня дает такой результат:

{
"KeyId": "arn:aws:kms:us-east-1:192491131326:key/<mykey>",
"CiphertextBlob": "AQICAHjQ7sViXQdeS4wWbFZpkOQWvCdNXqiy4Cnz0/xEBe39SQGz0vofeAo0+SyOXv172fqkAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhchHh0ugGzwRTC4gAgEQgCMlkhYlCYk2SfYIkfQ6ruwA71KBcN7ih/OPzSE86OT/eBOz3Q=="
}

И что тогда я смогу запустить:

aws kms decrypt --ciphertext-blob AQICAHjQ7sViXQdeS4wWbFZpkOQWvCdNXqiy4Cnz0/xEBe39SQGz0vofeAo0+SyOXv172fqkAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhchHh0ugGzwRTC4gAgEQgCMlkhYlCYk2SfYIkfQ6ruwA71KBcN7ih/OPzSE86OT/eBOz3Q==

Чтобы вернуть результат. Но пока ничего кроме:

An error occurred (InvalidCiphertextException) when calling the Decrypt operation:

Есть ли какой-то набор параметров, которые я могу передать команде дешифрования, чтобы она расшифровывала эту строку?


person Bert Cushman    schedule 28.03.2018    source источник
comment
В вашем примере возвращенный CiphertextBlob и переданный --ciphertext-blob похожи ... но не идентичны ... значения.   -  person Michael - sqlbot    schedule 29.03.2018
comment
Я очень впечатлен тем, что вы это заметили, но это просто я сделал ошибку, скопировав из нескольких источников при формировании вопроса, а не источник проблемы. Я просто повторил тест и убедился, что зашифрованный текстовый блок был одинаковым в обеих командах, но все же получаю ту же ошибку.   -  person Bert Cushman    schedule 29.03.2018
comment
У меня также была такая же ошибка, когда я попробовал то же самое, что и вы. Оказывается, нельзя комбинировать certutil с командами kms decrypt. Поэтому в официальном документе нам нужно сохранить двоичный файл для Windows. docs.aws.amazon.com/cli/latest/reference/ kms / decrypt.html   -  person Ming M Zheng    schedule 28.02.2019


Ответы (2)


Не уверен, что вы это уже нашли, но похоже, что это работает:

aws kms decrypt --ciphertext-blob fileb://<(echo "{YOUR CIPHERTEXTBLOB HERE}" | base64 -d) --output text --query Plaintext --region {REGION} | base64 -d

Это для Mac. В Windows я думаю, вам понадобится base64 -d.

Надеюсь это поможет.

person MarkT    schedule 13.06.2018

Я что-то делаю с aws kms, поэтому мне нужен способ работы с потоками, а не с файлами. В моей оболочке определены 2 функции, которые также можно использовать в сценариях. (Я оставил точки с запятой, потому что у меня они сжаты до одинарных строк в моем .bash_profile, но мне нравится разбивать вещи, когда я «преподаю».)

export KMS_KEY=b31ef212-168e-4f7c-ab2a-fe8a623ee465

kmse(){
  local key=${1:-$KMS_KEY};
  aws kms encrypt \
    --key-id $key \
    --plaintext "$(cat /dev/stdin)" \
    --query CiphertextBlob \
    --output text;
}

kmsd(){
  aws kms decrypt \
    --ciphertext-blob fileb://<( \
      cat /dev/stdin | \
      sed 's/.*kmscrypt:://' | \
      tr -d '\n' | \
      base64 -D
    ) \
    --output text \
    --query Plaintext | \
  base64 -D;
}

Функция kmse принимает аргумент options, который является UUID используемого ключа. В противном случае он использует ключ, указанный в переменной среды KMS_KEY. Обе функции читают /dev/stdin, чтобы получить то, что нужно зашифровать / расшифровать. Следовательно, все следующие примеры работают:

## Encrypting

$ tar -czf - /etc | kmse > etc.tgz.encrypted

$ kmse 77ed1d23-6013-47ce-b48a-2a968ef0ddaa < ~/.ssh/id_rsa > id_rsa.pem.encrypted

$ cat | kmse | netcat 10.0.0.123 8080
<content_pasted_from_my_clipboard>
^D

## Decrypting

$ kmsd < etc.tgz.encrypted | tar -zxf -

$ kmsd < id_rsa.pem.encrypted > ~/.ssh/id_rsa.pem

$ cat | kmsd | tee output.txt
<content_pasted_from_my_clipboard>
^D

# Note: ^D is a CTRL-D character that tells `cat` this is the End Of File.

А вот cat вставить CTRL-D - это крутая уловка. У меня есть скрипт под названием cb, который я использую для ввода и вывода данных из буфера обмена через стандартный ввод и стандартный вывод. И теперь он работает на Mac, Linux, Windows Cygwin и Windows WSL! Итак, я могу зашифровать и расшифровать то, что находится в моем буфере обмена, с помощью:

## Encrypt

$ cb | kmse | cb

## Decrypt

$ cb | kmsd | cb

Аналогичная концепция, характерная для Mac OSX:

## Encrypt

$ pbpaste | kmse | pbcopy

## Decrypt

$ pbpaste | kmsd | pbcopy
person Bruno Bronosky    schedule 12.12.2018
comment
Я вычеркиваю kmscrypt:: перед расшифровкой, потому что некоторые источники добавляют это перед зашифрованными данными в кодировке base64. Я подозреваю, что эти источники исходят от gruntwork.io или на них влияет gruntwork.io (и всегда безопасно пытаться это сделать, потому что :: недействителен base64 и в любом случае его не должно быть.) - person Bruno Bronosky; 12.12.2018