Mysql

MySQLで暗号化する方法と暗号化されているかの確認方法

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,.|