首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Ruby解密aws-kms中的密钥

用Ruby解密aws-kms中的密钥
EN

Stack Overflow用户
提问于 2019-03-14 17:39:58
回答 2查看 1K关注 0票数 5

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

我可以确认插件工作得很好,它用加密变量生成文件,我可以在AWS的环境中看到加密的变量。问题是我无法在Ruby中解密它。插件中解密它(正确)的代码是这里,我知道它获取保存在文件中的字符串,并使用Base64对其进行编码,所以没什么大不了的。在Ruby中:

代码语言:javascript
复制
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是如何使用的,虽然看起来与此无关。

有人知道怎么解决这个问题吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-01 16:58:55

我没有对字符串进行编码,而是对其进行解码。

代码语言:javascript
复制
token = "blablabla"
client = Aws::KMS::Client.new(region: 'us-east-1')
blob = Base64.decode64(token)
client.decrypt({ciphertext_blob: blob})
票数 2
EN

Stack Overflow用户

发布于 2019-03-16 10:01:03

它看起来像ciphertext_blob参数在Aws::KMS::Client#decrypt 期望一个二进制字符串中包含了要解密的加密密文

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

要获得加密的字符串,我们可以使用您的Aws::KMS::Client#encrypt (也称为ARN)和您想要以明文加密的字符串调用keyId。

在该调用的响应中,我们得到一个ciphertext_blob,这是我们需要用来解码的加密二进制字符串。

有时,您可能会看到二进制数据“解压缩”,您可以演示使用ciphertext_blob.unpack('H*')。如果您已经解压缩数据并希望对其进行解密,则需要打包它:encrypted_upacked_blob.pack('H*')

下面是明文字符串的往返编码和解码的完整示例:

代码语言:javascript
复制
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提供的两个例子:用Ruby加密AWS KMS中的数据用AWS KMS解密数据块

要更好地理解[blob].pack("H*")正在做什么,请查看这个StackOverflow帖子和Ruby的Array#pack文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55168878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档