« OS Xでのファイルの開かれ方 | メイン | ヒビノキロク・・ »

MySQLでカラムの暗号化/復元

DBを作る上で必ず悩んでしまう問題。
もし、もし、仮にDBからレコードのデータを全部ぶっこぬかれた場合、そこに個人情報が載っかってると非常にマズイ。
だから、もし、もし、仮にDBからレコードをぶっこぬかれても、データとして意味が内容に、暗号化しておけないか・・と。

DBに格納されている時は暗号化されておいて、スクリプトから取り出した時点で、復元されているという感じ。
MD5やCRYPTは、一方通行なため、暗号化する前のデータがわかってなければ使えない。

どうしたらいいものかと調べたので、結果をここにまとめる。

環境:MySQL 4.0.2以降

phoneというカラムがあり、これを暗号化する。

INSERT INTO test( phone )
VALUES (
AES_ENCRYPT( '0120-000-1234', 'secret_key' )
)

secret_keyは、復元するために必要なキー。

INSERTしたフィールドを見ると、、

SELECT hex( phone )
FROM `test`

結果:
D8637B3C6F6E4B86A48B5BFA7DD09D1B


となる。

次に、復元。

SELECT AES_DECRYPT( phone, 'secret_key' ) FROM `test`

結果:
0120-000-1234

暗号化/復元の為のキーをそのままSQLのクエリとして書いちゃうと、ソースを見られたり、ログ見られたりすると意味がないのだけれど。

その辺をもう一工夫する必要があるよなぁ。
それと、暗号化したカラムはwhereで指定できないってことくらいかな。

まぁ、実際はそれ以前のレイヤーでちゃんと防いどかないとダメだよね〜
でも、念には念を入れるってことで。極力バレたくないカラムは、上の方法で暗号化してみるのもありかと。

トラックバック

このエントリーのトラックバックURL:
http://www.ironhearts.com/diary/mt-tb-ih.cgi/561

コメントを投稿

2009年07月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

最近のコメント

こまったちゃん on 日々の記録: 本当に助かります。
bicycle on 文字化け: はじめまして、bic
dell on 日々の記録: 僕もヒートシンクの被
まる on 日々の記録: 昨日発生したのですが
通りすがり on spoolsv.exeがCPU 100%の対処法: 亀レスですが、 タス
on JavaScriptでクロスドメイン: こんなライブラリを見
ふりーどまん on 日々の記録: 私もSONYのVAI
ni-san on 日々の記録: このブログのおかげで
yan on thunderbirdを試す: ふたつの比較は同感で
teru on JavaScriptでクロスドメイン: 私もこの方式で実現し

アーカイブ