我有代码检索使用Amazon的aws kms加密函数加密的字符串。我想调用aws kms decrypt来取回未加密的值,但我想这样做而不将字符串写入二进制文件。我发现的所有示例都假设您将使用linux的base64命令或Window的certutil命令将base64编码的加密值转换为二进制文件。我试图在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:
我是否可以将一些参数传递给decrypt命令,以便解密此字符串?
答案 0 :(得分:2)
不确定您是否已经找到了这个,但这似乎有效:
aws kms decrypt --ciphertext-blob fileb://<(echo "YOUR CIPHERTEXTBLOB HERE" | base64 -D) --output text --query Plaintext --region eu-west-1 | base64 -D
这适用于Mac。在Windows上我认为你需要base64 -d。
希望这有帮助。
答案 1 :(得分:1)
我用aws kms
做东西,所以我想要一种处理流而不是文件的方法。我在shell中定义了2个函数,这些函数也可以放入脚本中。 (我留了分号是因为我将这些分号浓缩到了.bash_profile
中的oneliners中,但是我喜欢在“教学”时分手。)
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
环境var中指定的密钥。这两个函数都读取/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是一个很酷的技巧。我有a script called cb
,可用于通过stdin和stdout将数据进出剪贴板。 它现在可以在Mac,Linux,Windows Cygwin和Windows WSL上运行!因此,我可以使用以下方法加密和解密剪贴板中的内容:
## Encrypt
$ cb | kmse | cb
## Decrypt
$ cb | kmsd | cb
Mac OSX特定的类似概念是:
## Encrypt
$ pbpaste | kmse | pbcopy
## Decrypt
$ pbpaste | kmsd | pbcopy