AWS KMSによる、データの暗号化と復号 - 対称鍵編
対称鍵はかんたん。
鍵の作成
Management ConsoleでもCLIでもお好みで。 以下のパラメータでCMK (Customer Management Key)を作成する。
- キーのタイプ:
対称
- キーマテリアルオリジン:
KMS
鍵情報の取得
CLIで、describe-keyを使って鍵の情報を得る。
$ aws kms describe-key --key-id alias/aestest
{
"KeyMetadata": {
"AWSAccountId": "xxxxxxxxxxxxx",
"KeyId": "a99dd0c2-494f-4650-99ba-811078e86390",
"Arn": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxxx:key/a99dd0c2-494f-4650-99ba-811078e86390",
"CreationDate": 1596705473.686,
"Enabled": true,
"Description": "",
"KeyUsage": "ENCRYPT_DECRYPT",
"KeyState": "Enabled",
"Origin": "AWS_KMS",
"KeyManager": "CUSTOMER",
"CustomerMasterKeySpec": "SYMMETRIC_DEFAULT",
"EncryptionAlgorithms": [
"SYMMETRIC_DEFAULT"
]
}
}
Data Keyの取得
generate-data-keyで、平文のData Keyと暗号化されたData Keyが落ちてくる。
$ aws kms generate-data-key --key-id alias/aestest --key-spec AES_256
{
"CiphertextBlob": "AQIDAHizJ7k8Iy6GrPV/ExEn64vrdh6dhDbGez4hVZW2oP6C1gFj7ZyUbuDUX6..",
"KeyId": "arn:aws:kms:ap-northeast-1:xxxxxxxxxxxxx:key/a99dd0c2-494f-4650-99ba-811078e86390"
}
CiphertextBlobは復号時に必要になるので、DynamoDB等で別途管理する。 平文のData Key(Plaintext)をdatakeyに格納し、この鍵を使って、データを暗号化する。
データの暗号化
平文のData Keyを使って普通に暗号化する。
openssl aes-256-cbc -e -\
in plain_data \
-pass file:plain_datakey \
-out encrypted_data \
-pbkdf2
暗号化が終わったら、平文のData Keyは必ず削除すること。 これを怠るとKMSを使う意味がない。
データの復号
別途管理していた、暗号化されたData Keyをkmsで復号して、Data Keyを取得する。 暗号化されたData Keyが、Base64エンコードされてencrypted_datakey.txtに格納されていた場合、 base64デコード後、kmsを使ってData Keyを復号する。
$ base64 -d encrypted_datakey.txt >encrypted_datakey
$ aws kms decrypt --key-id alias/aestest \
--ciphertext-blob fileb://encrypted_datakey \
--output text --query Plaintext | base64 -d >decrypted_datakey
Data Keyが、decrypted_datakeyに格納されたので、データが復号できる。
$ openssl aes-256-cbc -d \
-in encrypted_data \
-out decrypted_data \
--pass file:decrypted_datakey \
-pbkdf2
$ sha256sum plain_data.bin decrypted_data.bin
5678c5a7a63f910c6eb172ebb3736b73099b8d62172c6b42034d87b7bf30b107 plain_data
5678c5a7a63f910c6eb172ebb3736b73099b8d62172c6b42034d87b7bf30b107 decrypted_data
一致した。復号が成功したことがわかる。
Have Fun!