第二节提到,KMS加密有两种场景:
data key
来加密。本节我们将对第二种场景进行详细介绍。
AWS cli可以生成data key
和encrypted data key
:
Plaintext (明文数据密钥):这是未加密的数据密钥(data key),以 Base64 编码展示。这个密钥可直接用于加密操作
CiphertextBlob (加密的数据密钥): 这是被 KMS 主密钥(CMK)加密后的数据密钥(encrypted data key),也是以 Base64 编码形式展示。这个加密版本可以安全存储,只有具备相应权限的用户才能使用 KMS 服务将其解密。
但aws提供了专门的Encryption SDK,直接使用这个更方便:
https://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/crypto-cli-install.html
pip3 install aws-encryption-sdk-cli
加密时需要指定要加密的文件:
aws-encryption-cli --encrypt --input myPlaintextData \
--wrapping-keys key=1234abcd-12ab-34cd-56ef-1234567890ab \
--output myEncryptedMessage \
--metadata-output ~/metadata \
--encryption-context purpose=test
例如,准备一个test.png
文件,对它进行加密:
aws-encryption-cli --encrypt --input test.png \
--wrapping-keys key=a323129b-c984-42ec-a2da-936874fafa4a \
--output test.png.encrypted \
--metadata-output metadata
生成加密后的文件和metadata文件:
生成metadata如下:
在这个文件里面,我们看到了CiphertextBlob。 CiphertextBlob (加密的数据密钥): 这是被 KMS 主密钥(CMK)加密后的数据密钥(encrypted data key),也是以 Base64 编码形式展示。这个加密版本可以安全存储,只有具备相应权限的用户才能使用 KMS 服务将其解密。
解密:
aws-encryption-cli --decrypt --input myEncryptedMessage \
--wrapping-keys key=arn:aws:kms:us-west-2:145197526627:key/a323129b-c984-42ec-a2da-936874fafa4a \
--output myPlaintextData \
--metadata-output ~/metadata \
--encryption-context purpose=test
注释解密的时候,key必须传入arn格式:
aws-encryption-cli --decrypt --input test.png.encrypted \
--wrapping-keys key=arn:aws:kms:us-west-2:145197526627:key/a323129b-c984-42ec-a2da-936874fafa4a \
--output test-decrypted.png \
--metadata-output metadata
解密后的文件和原来的一模一样:
参考: https://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/crypto-cli-how-to.html