DBを作る上で必ず悩んでしまう問題。
もし、もし、仮にDBからレコードのデータを全部ぶっこぬかれた場合、そこに個人情報が載っかってると非常にマズイ。
だから、もし、もし、仮にDBからレコードをぶっこぬかれても、データとして意味が内容に、暗号化しておけないか・・と。
DBに格納されている時は暗号化されておいて、スクリプトから取り出した時点で、復元されているという感じ。
MD5やCRYPTは、一方通行なため、暗号化する前のデータがわかってなければ使えない。
どうしたらいいものかと調べたので、結果をここにまとめる。
環境:MySQL 4.0.2以降
phoneというカラムがあり、これを暗号化する。
VALUES (
AES_ENCRYPT( '0120-000-1234', 'secret_key' )
)
secret_keyは、復元するために必要なキー。
INSERTしたフィールドを見ると、、
FROM `test`
結果:
D8637B3C6F6E4B86A48B5BFA7DD09D1B
となる。
次に、復元。
結果:
0120-000-1234
暗号化/復元の為のキーをそのままSQLのクエリとして書いちゃうと、ソースを見られたり、ログ見られたりすると意味がないのだけれど。
その辺をもう一工夫する必要があるよなぁ。
それと、暗号化したカラムはwhereで指定できないってことくらいかな。
まぁ、実際はそれ以前のレイヤーでちゃんと防いどかないとダメだよね〜
でも、念には念を入れるってことで。極力バレたくないカラムは、上の方法で暗号化してみるのもありかと。