在Ruby中从aws-kms解密密钥

时间:2019-03-14 17:39:59

标签: node.js ruby serverless-framework aws-kms

我在无服务器框架字上使用serverless-kms-secrets来设置一些我想使用Ruby使用的ENV变量。

我可以确认插件可以正常工作,它使用加密变量生成了文件,并且可以在我的环境中在AWS lambda上看到加密变量。 问题是我无法在Ruby中对其进行解密。在插件中(正确)解密它的代码是here,我知道它获取保存在文件中的字符串并使用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 个答案:

答案 0 :(得分:2)

我不必对字符串进行编码,而是对其进行解码。

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

答案 1 :(得分:1)

看起来像ciphertext_blob expects a binary string中的Aws::KMS::Client#decrypt自变量,其中包含the encrypted Ciphertext that you want to decrypt

在您的示例中,您将未加密的Base64编码的字符串传递到decrypt中。相反,您需要传递加密的二进制字符串

要获取加密的字符串,我们可以使用您的keyId(也称为ARN)和要以纯文本格式加密的字符串来调用Aws::KMS::Client#encrypt

在该调用的响应中,我们返回一个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提供的两个示例:Encrypting Data in AWS KMS using Ruby SDKDecrypting a Data Blob in AWS KMS

要更好地了解[blob].pack("H*")在做什么,请查看this StackOverflow post和Ruby的Array#pack文档。