マスキングに便利! MySQLでAESを利用した暗号化と複合化の方法

こんにちは。池島です。
 
個人情報保護の観点から、システム開発でデータを保持する際マスキングを利用することがあります。今回はMySQLでのマスキング方法として、AESを利用した暗号化と複合化の方法をご紹介します。

検証環境

今回検証を行ったMySQLのバージョンは以下の通りです。

MySQL
8.0.32

AESとは

Advanced Encryption Standard (AES) は、アメリカが2001年に標準暗号として定めた共通鍵暗号アルゴリズムである。アメリカ国立標準技術研究所(NIST)が公募し、Rijndael(ラインダール)がAESとして採用された。

wikipedia

つまり、広く使われている共通鍵形式の暗号化方式になります。

暗号化の方法

暗号化には以下の関数を利用します。

AES_ENCRYPT(str, key_str)

暗号化したい文字列strを、共通鍵文字列のkey_strを利用して暗号化します。ここで利用した共通鍵文字列は複合化の際に利用しますので、忘れないように注意が必要です。
 
返却される値はバイナリ文字になりますので、暗号化されるデータを格納するテーブルはVARBINARY等、BINARY型を格納できる定義にしましょう。例えば、以下の通り利用します。
INSERT INTO crypt_test(str_val, crypt_str) 
VALUES ('TEST', AES_ENCRYPT('TEST', 'password'));

入力したデータを確認すると以下の通りになります。

str_val(varchar) crypt_str(varbinary)
TEST 445DB609313D32C61C3FE6132DD6F2CC

crypt_strに暗号化された値が挿入されています。

複合化の方法

複合化には以下の関数を利用します。

AES_DECRYPT(crypt_str, key_str)

暗号化された文字列crypt_strを、暗号化した際に利用した共通鍵文字列のkey_strを利用して複合化します。返却される値はバイナリ文字になりますので、扱いたいデータ型に変換しましょう。例えば、以下の通り利用します。
SELECT
    str_val
    , crypt_str
    , CAST(AES_DECRYPT(crypt_str, 'password') AS CHAR) decrypt_str
FROM
    crypt_test

実行した結果以下のデータが取得されます。

str_val crypt_str decrypt_str
TEST 445DB609313D32C61C3FE6132DD6F2CC TEST

無事暗号化されていたcrypt_strが複合化されましたね。

まとめ

いかがでしたでしょうか。
 
暗号化されたデータを利用するシステムにおいて、暗号化の知識は実装やデータ確認をする際に必要になることがあります。参考にしていただけると幸いです。
 
ではまた!
 
 
 
 
《関連記事》

MariaDB Connector/J + Amazon Aurora でタイムアウト発生
技術
2019.2.13(Wed)

MariaDB Connector/J + Amazon Aurora でタイムアウト発生

#プログラム #Java #データベース

MySQLでコネクションタイムアウト発生
技術
2019.8.16(Fri)

【エラー解決方法】MySQLでコネクションタイムアウト発生!? を解決する方法

#プログラム #Java #データベース

MySQLのLIKE検索で濁点、半濁点を区別する方法
技術
2023.11.15(Wed)

MySQLであいまい検索! LIKE検索で濁点、半濁点を区別する方法

#データベース

記事をシェア
MOST VIEWED ARTICLES