如何在不使用二进制文件的情况下调用亚马逊的 AWS kms 解密函数?

Ber*_*man 11 amazon-web-services aws-kms

我有代码可以检索使用亚马逊的 aws kms 加密功能加密的字符串。我想调用 aws kms 解密来取回未加密的值,但我想在不将字符串写入二进制文件的情况下执行此操作。我发现的所有示例都假设您将使用 linux 的 base64 命令或 Window 的 certutil 命令将 base64 编码的加密值转换为二进制文件。我正在尝试在 Windows 系统上执行此操作。在我看来你应该能够运行:

aws kms encrypt --key-id <mykey> --plaintext "mysecret"
Run Code Online (Sandbox Code Playgroud)

这对我来说产生了这个结果:

{
"KeyId": "arn:aws:kms:us-east-1:192491131326:key/<mykey>",
"CiphertextBlob": "AQICAHjQ7sViXQdeS4wWbFZpkOQWvCdNXqiy4Cnz0/xEBe39SQGz0vofeAo0+SyOXv172fqkAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhchHh0ugGzwRTC4gAgEQgCMlkhYlCYk2SfYIkfQ6ruwA71KBcN7ih/OPzSE86OT/eBOz3Q=="
}
Run Code Online (Sandbox Code Playgroud)

然后我应该能够运行:

aws kms decrypt --ciphertext-blob AQICAHjQ7sViXQdeS4wWbFZpkOQWvCdNXqiy4Cnz0/xEBe39SQGz0vofeAo0+SyOXv172fqkAAAAZjBkBgkqhkiG9w0BBwagVzBVAgEAMFAGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMhchHh0ugGzwRTC4gAgEQgCMlkhYlCYk2SfYIkfQ6ruwA71KBcN7ih/OPzSE86OT/eBOz3Q==
Run Code Online (Sandbox Code Playgroud)

取回结果。但到目前为止,我一直无法得到任何东西,除了:

An error occurred (InvalidCiphertextException) when calling the Decrypt operation:
Run Code Online (Sandbox Code Playgroud)

是否有一些参数可以传递给解密命令,以便它解密这个字符串?

小智 16

不确定你是否已经找到了这个,但这似乎有效:

aws kms decrypt --ciphertext-blob fileb://<(echo "{YOUR CIPHERTEXTBLOB HERE}" | base64 -d) --output text --query Plaintext --region {REGION} | base64 -d
Run Code Online (Sandbox Code Playgroud)

这是针对 Mac 的。在 Windows 上,我认为您需要 base64 -d。

希望这可以帮助。


Bru*_*sky 7

我做了一些事情,aws kms所以我想要一种处理流而不是文件的方法。我在我的 shell 中定义了 2 个函数,它们也可以放入脚本中。(我保留了分号,因为我将这些浓缩为单行,.bash_profile但我喜欢在“教学”时将其分解。)

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;
}
Run Code Online (Sandbox Code Playgroud)

kmse函数采用一个 options 参数,它是要使用的键的 UUID。否则,它使用KMS_KEY环境变量中指定的密钥。这两个函数都读取/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.
Run Code Online (Sandbox Code Playgroud)

虽然cat粘贴 CTRL-D 是一个很酷的技巧。我有一个名为的脚本cb,用于通过 stdin 和 stdout 将数据传入和传出剪贴板。它现在适用于 Mac、Linux、Windows Cygwin 和 Windows WSL!因此,我可以使用以下命令加密和解密剪贴板中的内容:

## Encrypt

$ cb | kmse | cb

## Decrypt

$ cb | kmsd | cb
Run Code Online (Sandbox Code Playgroud)

Mac OSX 特有的类似概念是:

## Encrypt

$ pbpaste | kmse | pbcopy

## Decrypt

$ pbpaste | kmsd | pbcopy
Run Code Online (Sandbox Code Playgroud)


Sam*_*han 1

我不知道这是否是因为 AWS CLI v2 发生了任何变化,但这对我有用。

$ aws --version
aws-cli/2.11.3 Python/3.11.2 Darwin/22.3.0 source/arm64 prompt/off
Run Code Online (Sandbox Code Playgroud)

我建议始终使用该--region标志,以确保您使用来自所需区域的正确 KMS 密钥。

加密

$ aws kms encrypt --region us-east-1 --key-id alias/my-kms-key --plaintext "$(echo 'MY_SECRET_TO_ENCRYPT' | base64)"
{
    "CiphertextBlob": "AQICAHjmSj9FB9J0...",
    "KeyId": "arn:aws:kms:us-east-1:1234567890:key/...",
    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}
Run Code Online (Sandbox Code Playgroud)

只需要CiphertextBlob

$ aws kms encrypt --region us-east-1 --key-id alias/my-kms-key --plaintext "$(echo 'MY_SECRET_TO_ENCRYPT' | base64)" --output text --query CiphertextBlob
AQICAHjmSj9FB9J0...
Run Code Online (Sandbox Code Playgroud)

请注意,如果您对相同的字符串加密两次,您很可能会得到不同的 CiphertextBlob字符串,这是正常的。

解密

$ aws kms decrypt --region us-east-1 --ciphertext-blob 'AQICAHjmSj9FB9J0...' --key-id alias/my-kms-key
{
    "KeyId": "arn:aws:kms:us-east-1:1234567890:key/...",
    "Plaintext": "TVlfU0VDUkVUX1RPX0VOQ1JZUFQK",
    "EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}
Run Code Online (Sandbox Code Playgroud)

Plaintext是用base64编码的,所以解码它:

$ echo 'TVlfU0VDUkVUX1RPX0VOQ1JZUFQK' | base64 -d
MY_SECRET_TO_ENCRYPT
Run Code Online (Sandbox Code Playgroud)

直接解码Plaintext

$ aws kms decrypt --region us-east-1 --ciphertext-blob 'AQICAHjmSj9FB9J0...' --key-id alias/my-kms-key --output text --query Plaintext | base64 -d
MY_SECRET_TO_ENCRYPT
Run Code Online (Sandbox Code Playgroud)