MySQLでは、テーブル単位で暗号化を設定することができます。
この記事では、create table
文にENCRYPTION='Y'
オプションを追加して暗号化を設定する方法と、実際にデータが暗号化されているかを確認する方法を解説します。
確認方法としては、テストデータを挿入し、hexdump
コマンドを使用して確認するのが効果的です。
手順
暗号化されていない場合の確認
まず、暗号化されていないテーブルを作成し、データを挿入して確認します。今回の例ではtest_aというテーブルを作成して、文字列’aaa’を挿入してみます。
mysql> create table test_a (aaa char(10)); Query OK, 0 rows affected (0.02 sec) mysql> insert into test_a values('aaa'); Query OK, 0 rows affected (0.02 sec) mysql> commit mysql> quit
物理データファイルのテーブルファイルを確認します。
物理データファイルの場所は環境によって異なりますが、/var/lib/mysql/データベース名に配置されていることが多いです。
$ cd /var/lib/mysql/[DB名] $ hexdump -C test_a.ibd | grep aaa 000000a0 ff ff 00 00 ff ff ff ff 00 00 00 00 00 02 aa fe |................| 000040b0 b0 51 04 78 9e 70 85 68 aa 7f d0 f2 f3 f1 8f ed |.Q.x.p.h........| 000040f0 06 66 f6 aa 9f dd 50 cc 58 a7 38 0f 1a 0b 0c ca |.f....P.X.8.....| (続く) 000100b0 02 01 00 00 00 00 0d 17 81 00 00 01 1a 01 10 61 |...............a| 000100c0 61 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |aa |
最終行のように挿入した文字列’aaa’が平文で確認できます。
暗号化されている場合の確認
次に、暗号化されたテーブルを作成し、データを挿入して確認します。
暗号化オプションENCRYPTION=’Y’を使用してテーブルを作成します。
mysql> create table test_b (aaa char(10)); Query OK, 0 rows affected (0.02 sec) mysql> insert into test_b values('aaa'); Query OK, 0 rows affected (0.02 sec) mysql> commit mysql> quit
物理データファイルのテーブルファイルを確認します。
挿入した文字列が暗号化されているため文字列’aaa’がhexdumpで見た時も確認できません。
$ cd /var/lib/mysql/[DB名]<br> $ hexdump -C test_a.ibd 000000a0 ff ff 00 00 ff ff ff ff 00 00 00 00 00 02 aa fe |................| 000040b0 b0 51 04 78 9e 70 85 68 aa 7f d0 f2 f3 f1 8f ed |.Q.x.p.h........| 000040f0 06 66 f6 aa 9f dd 50 cc 58 a7 38 0f 1a 0b 0c ca |.f....P.X.8.....| (続く) 00013f60 2c d2 3e e6 7d 8a 72 f1 0c 7e 5f e6 65 aa bb c4 |,.>.}.r..~_.e...| 00013fd0 ad 4f 13 d0 ac 17 aa 03 b9 59 92 2b f5 73 2c ee |.O.......Y.+.s,.|