web-dev-qa-db-ja.com

バイナリファイルを使用せずにAmazonのAWSkms復号化関数を呼び出すにはどうすればよいですか?

Amazonのawskms暗号化関数を使用して暗号化された文字列を取得するコードがあります。暗号化されていない値を取得するためにawskms復号化を呼び出したいのですが、バイナリファイルに文字列を書き込まずにこれを実行したいと思います。私が見つけたすべての例では、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コマンドに渡すことができるパラメータのセットはありますか?

5
Bert Cushman

私はaws kmsを使って作業をしているので、ファイルではなくストリームを操作する方法が必要でした。シェルに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;
}

kmse関数は、使用するキーのUUIDであるoptions引数を取ります。それ以外の場合は、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.

cat貼り付けCTRL-Dはクールなトリックです。 cb というスクリプトがあり、stdinとstdoutを介してクリップボードにデータを出し入れするために使用しています。 そして、Mac、Linux、Windows Cygwin、およびWindows WSLで動作するようになりました!したがって、クリップボードにあるものを次のように暗号化および復号化できます。

## Encrypt

$ cb | kmse | cb

## Decrypt

$ cb | kmsd | cb

MacOSX固有の同様の概念は次のとおりです。

## Encrypt

$ pbpaste | kmse | pbcopy

## Decrypt

$ pbpaste | kmsd | pbcopy
1
Bruno Bronosky

あなたがすでにこれを見つけたかどうかはわかりませんが、これはうまくいくようです:

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
MarkT