我在无服务器框架字上使用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的使用方式,尽管看起来并不相关。
有人知道如何解决吗?
答案 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 SDK和Decrypting a Data Blob in AWS KMS。
要更好地了解[blob].pack("H*")
在做什么,请查看this StackOverflow post和Ruby的Array#pack
文档。