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

CakePHP 3.8で構築中のサービスで暗号化と復号化の必要が出てきた。
ザ・PHPらしくOpenSSLでも良かったのだけど、頭の片隅にあった一度は使ってみたかったAWSのKMSにてここはスマートにやってみようとチャレンジ!
以下、簡略的に手順をメモしておく。
AWSコンソールの設定
AWSのコンソール→[KMS]に進む

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側で暗号化・復号化
当然のこと
が環境にインストールされていること。
【暗号化】
$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初心者なので初歩的なことしかできていないが、とりあえず暗号化・復号化という目的は達成できた!
ディスカッション
コメント一覧
まだ、コメントがありません