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!


awskms

663 Words

2020-08-07 16:48 +0900