Authenticated Encryption with the AWS CLI
June 28, 2017 #aws #cli #encryption
I wanted to understand Authenticated Encryption better as a follow up to my research on Encrypted Properties and AWS IAM Roles. I decide to try and learn interactively, so I saved some “sensitive” data into a file.
$ echo -n "P@ssword1" > pw1.txtThen using aws kms encrypt from the AWS CLI, I tried to encrypt one of the values.
$ aws kms encrypt \
--key-id arn:aws:kms:us-west-2:123456789012:key/79cce4f6-7e4d-42ab-9942-9e6bb05b6121 \
--plaintext fileb://pw1.txt
An error occurred (NotFoundException) when calling the Encrypt operation: Invalid arnHmm, that didn’t work despite using the full ARN (which includes the region). I need to set the AWS region explicitly and --region is one of the general options for the AWS CLI (see AWS CLI Configuration Variables). If you didn’t know about the region restriction, that error message wouldn’t be very helpful.
$ aws kms encrypt \
--region us-west-2 \
--key-id 79cce4f6-7e4d-42ab-9942-9e6bb05b6121 \
--plaintext fileb://pw1.txt
{
"CiphertextBlob": "AQECAHizfom2LowDtrU53mpnuTkvNGUC8c+nPE8dtp40x+QLMAAAAGcwZQYJKoZIhvcNAQcGoFgwVgIBADBRBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDEubUtCeZ5dJiDjQ4QIBEIAkhYDNKHuwbu5FSxP1sknpWa5K0lOVnXBLIXg6K+ekvSyrOW+M",
"KeyId": "arn:aws:kms:us-west-2:123456789012:key/79cce4f6-7e4d-42ab-9942-9e6bb05b6121"
}If I encrypt it again, the CiphertextBlob value is different (but starts with many of the same characters).
$ aws kms encrypt \
--region us-west-2 \
--key-id 79cce4f6-7e4d-42ab-9942-9e6bb05b6121 \
--plaintext fileb://pw1.txt
{
"CiphertextBlob": "AQECAHizfom2LowDtrU53mpnuTkvNGUC8c+nPE8dtp40x+QLMAAAAGcwZQYJKoZIhvcNAQcGoFgwVgIBADBRBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDJyjJV/HtiuS0S8pFAIBEIAkMe2atLnrx1L2/TtuGx4hS+9bN/76AgaEkK5lvUbiCA+xhC+Y",
"KeyId": "arn:aws:kms:us-west-2:123456789012:key/79cce4f6-7e4d-42ab-9942-9e6bb05b6121"
}I went back to the original example from the AWS CLI documentation, and saved the binary, encrypted data to a file:
$ aws kms encrypt \
--region us-west-2 \
--key-id 79cce4f6-7e4d-42ab-9942-9e6bb05b6121 \
--plaintext fileb://pw1.txt \
--output text \
--query CiphertextBlob \
| base64 --decode > ExampleEncryptedFileThen it was time to decrypt and verify I could get my original data back.
$ aws kms decrypt \
--ciphertext-blob fileb://ExampleEncryptedFile \
--output text \
--query Plaintext
An error occurred (AccessDeniedException) when calling the Decrypt operation: The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.Notice I didn’t need to provide the KMS key id. However, I have the same region problem - but this time, I had an error message that gives me a hint.
$ aws kms decrypt \
--region us-west-2 \
--ciphertext-blob fileb://ExampleEncryptedFile \
--output text \
--query Plaintext
UEBzc3dvcmQxThat worked but didn’t look like my password. I needed to base64 decode the value.
$ aws kms decrypt \
--region us-west-2 \
--ciphertext-blob fileb://ExampleEncryptedFile \
--output text \
--query Plaintext \
| base64 --decode
P@ssword1Back to Authenticated Encryption, where I need to provide a name-value pair that specifies the encryption context using the --encryption-context parameter.
$ aws kms encrypt \
--region us-west-2 \
--key-id 79cce4f6-7e4d-42ab-9942-9e6bb05b6121 \
--encryption-context database_username=service1 \
--plaintext fileb://pw1.txt \
--output text \
--query CiphertextBlob \
| base64 --decode > ExampleAuthenticatedEncryptedFileAnd for the decrypt, I need to provide the same --encryption-context parameter.
$ aws kms decrypt \
--region us-west-2 \
--encryption-context database_username=service1 \
--ciphertext-blob fileb://ExampleAuthenticatedEncryptedFile \
--output text \
--query Plaintext \
| base64 --decode
P@ssword1With an incorrect context, I get an InvalidCiphertextException.
$ aws kms decrypt \
--region us-west-2 \
--encryption-context database_username=service2 \
--ciphertext-blob fileb://ExampleAuthenticatedEncryptedFile \
--output text \
--query Plaintext \
| base64 --decode
An error occurred (InvalidCiphertextException) when calling the Decrypt operation: