Расшифровка ключей от aws-kms в Ruby - PullRequest
5 голосов
/ 14 марта 2019

Я использую serverless-kms-secrets на бессерверном фреймворке, чтобы установить некоторые переменные ENV, которые я хочу использовать, используя Ruby.

Я могу подтвердить, что плагин работает отлично, он сгенерированфайл с зашифрованной переменной, и я вижу зашифрованную переменную в моей среде на AWS lambda.Проблема в том, что я не могу расшифровать его в Ruby.Код, который расшифровывает его (правильно) в плагине: здесь , я так понимаю, он получает строку, сохраненную в файле, и кодирует ее с использованием Base64, так что ничего страшного.В Ruby:

token = "blablabla"
client = Aws::KMS::Client.new(region: 'us-east-1')
blob = Base64.encode64(token)
client.decrypt({ciphertext_blob: blob})
....
Aws::KMS::Errors::InvalidCiphertextException ()

Клиент должен автоматически получать мои учетные данные, но я не уверен, что понимаю, как используется keyArn, хотя и не выглядит актуальным.

У кого-нибудь естьесть идеи как решить это?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2019

Вместо того, чтобы кодировать строку, мне пришлось ее декодировать.

token = "blablabla"
client = Aws::KMS::Client.new(region: 'us-east-1')
blob = Base64.decode64(token)
client.decrypt({ciphertext_blob: blob})
1 голос
/ 16 марта 2019

Похоже, что аргумент ciphertext_blob в Aws::KMS::Client#decrypt ожидает двоичную строку , которая включает зашифрованный зашифрованный текст, который вы хотите расшифровать .

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

Чтобы получить зашифрованную строку, мы можем вызвать Aws::KMS::Client#encrypt с вашим keyId (также известным как ARN) и строкой, которую вы хотите зашифровать в виде открытого текста.

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

Иногда вы можете увидеть, что двоичные данные «распакованы», что вы можете продемонстрировать, выполнив ciphertext_blob.unpack('H*'). Если вы распаковали данные и хотите расшифровать их, вам нужно их упаковать: encrypted_upacked_blob.pack('H*').

Вот полный пример двустороннего кодирования и декодирования строки открытого текста:

require 'aws-sdk-kms'

client = Aws::KMS::Client.new

key_id = 'arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab'

plaintext_to_encrypt = 'blablabla'

encrypt_response = client.encrypt({
  key_id: key_id,
  plaintext: plaintext_to_encrypt,
})

encrypt_response.ciphertext_blob
# => "\x01\x02\x02\x00xt/Jyu\x85B\xCA\x16v\xDAa3DM1$\e8Y\xF9\x812\x1E\xA9\xD3\xE3R\x1E/}\xCA\x...

encrypted_upacked_blob = encrypt_response.ciphertext_blob.unpack('H*')
# => ["0102020078742f4a79758542ca1676da6133444d31241b3859f981321ea9d3e3521e2f7dca01a7f89f2ee03...

encrypted_packed_blob = encrypted_upacked_blob.pack('H*')
# => "\x01\x02\x02\x00xt/Jyu\x85B\xCA\x16v\xDAa3DM1$\e8Y\xF9\x812\x1E\xA9\xD3\xE3R\x1E/}\xCA\x...

decrypt_response = client.decrypt({
  ciphertext_blob: encrypted_packed_blob
})

decrypted_plaintext = decrypt_response.plaintext
# => "blablabla"

Этот пример объединяет два примера, предоставленных AWS: Шифрование данных в AWS KMS с использованием Ruby SDK и Дешифрование BLOB-объектов данных в AWS KMS .

Чтобы лучше понять, что делает [blob].pack("H*"), прочитайте этот пост StackOverflow и документацию Руби Array#pack.

...