2014年12月15日月曜日

MySQLで、データ保存時の暗号化と復号化


百聞は一見に如かず。MySQLの標準関数で実装できるなんて便利です。

注:本記事は、データベースの暗号化ではなく、カラム(項目)単位です。

サンプル用のテーブル作成


DROP TABLE IF EXISTS `encrytest`;
CREATE TABLE `encrytest` (
 `ID` int(11) NOT NULL AUTO_INCREMENT,
 `Value1` varchar(200) DEFAULT NULL,
 `Value2` varchar(200) DEFAULT NULL,
 PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=UTF8;

サンプルデータの登録


INSERT INTO ENCRYTEST (VALUE1,VALUE2) VALUES (HEX(AES_ENCRYPT('AIUEO','CRYPTKEY')),'KAKIKUKEKO');

データ読み出し (そのまま読みだしてみる。


SELECT ID , VALUE1,VALUE2 FROM ENCRYTEST;
+----+----------------------------------+------------+
| ID | VALUE1              | VALUE2   |
+----+----------------------------------+------------+
|  1 | E50F8C75A2C25FC6C8CDF8AA10C78B41 | KAKIKUKEKO |
+----+----------------------------------+------------+
1 row in set

データ読み出し(復号化して読みだす


SELECT ID , AES_DECRYPT(UNHEX(VALUE1),'CRYPTKEY') AS VALUE1,VALUE2 FROM ENCRYTEST;

+----+--------+------------+
| ID | VALUE1 | VALUE2   |
+----+--------+------------+
|  1 | AIUEO  | KAKIKUKEKO |
+----+--------+------------+
1 row in set

その他メモ


 HEXで保存するので、保存に必要なバイト数は、増えます。
 ※計算してませんが、4倍程度?
 他のBlogなどを参照すると、blogを使うとか、bigbinaryを使うとか、
 色々とアドバイスが出ています。
 今回は、HEX,UNHEXを使っていますが、blobとかだとそれは必要なさそう。






0 件のコメント: