暗号化と復号化にAWSのKey Management Service (KMS)を使ってみた

2020年9月3日

f:id:ryurin-business:20200114095633p:plain
AWS KMS

CakePHP 3.8で構築中のサービスで暗号化と復号化の必要が出てきた。

ザ・PHPらしくOpenSSLでも良かったのだけど、頭の片隅にあった一度は使ってみたかったAWSのKMSにてここはスマートにやってみようとチャレンジ!

以下、簡略的に手順をメモしておく。

AWSコンソールの設定

AWSのコンソール→[KMS]に進む

f:id:ryurin-business:20200114093143p:plain
KMS_1

Step.1

Key Type:単純な暗号と復号ができれば良いのでSymmetrcを選択

Step.2

Alias:適当にわかりやすい別名で

Tags:こちらも後から探しやすく(省略)

Step.3

Key administrators:キー管理者にするユーザを選択。管理者用に新たにユーザを作成するもよし、既存ユーザにつけるもよし

Step.4

Define key usage permissions:権限を付与するユーザを選択。ここは管理者以外は使わないので省略

Step.5

Review and edit key policy:コードで設定内容を確認(そのまま)

AWSでの設定は以上。

続いて

PHP側で暗号化・復号化

当然のこと

AWS SDK for PHP | AWS

が環境にインストールされていること。

【暗号化】

$textが実際に暗号化する文字列

use Aws\Kms\KmsClient;
$kms = KmsClient::factory(AWS_KMS_CONFIGURE);
try {
    $result = $kms->encrypt([
        'KeyId' => AWS_KMS_KEY_ID,
        'Plaintext' => $text,
    ]);
    $encrypt_code = base64_encode($result->get('CiphertextBlob'));
    echo $encrypt_code;
} catch (AwsException $e) {

echo $e->getMessage();
    echo "\n";
}

AWS_KMS_CONFIGUREは定数なので、実際は

const AWS_KMS_CONFIGURE = [
    'credentials' => [
        'key' => 'XXXXXXXXXXXXXXXXX',
        'secret' => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    ],
    'region' => 'ap-northeast-1', //リージョンは日本

'version' => 'latest' //バケットのバージョニングは最新
];

という形でConfidentialしている感じ。

【復号化】

$textが復号化され取得された文字列

use Aws\Kms\KmsClient;
$kms = KmsClient::factory(AWS_KMS_CONFIGURE);
$result = $kms->decrypt([
    'CiphertextBlob' => base64_decode($post['q']),
]);
$text = $result->get('Plaintext');

という流れ。

使ってみての所感としては、

・暗号化する際にbase64をかけるのだが、かけない文字列を見ても文字化けのような文字列になっている。

・暗号化された後のコードは異なる模様。だけどしっかり復号化できる。(ここがOpenSSLに比べてよりセキュアといった感じ)

まだまだKMS初心者なので初歩的なことしかできていないが、とりあえず暗号化・復号化という目的は達成できた!