[PHP]重要な文字列を暗号化して保管し、利用するときは復元する方法

PHP

重要な個人情報をフォーム等から受取り、データベースへ保存する際には気をつけなければいけません
社内のシステムであってもダンプデータを持ち出されれば個人情報が丸見えの状態で取り出すことができてしまいます

パスワードなんかは確認の際に利用するだけなのでハッシュ化して、保存されている値とPOSTされた値を比べればいいので復元する必要はありませんが、顧客の住所などを保存したい場合は後で再利用するので復元できる形で保存する必要がでてきます

PHPを使ってMySQLなどのデータベースに保存する方法をご紹介します

使用する関数は mcrypt

まずは暗号化する処理です

ここで暗号化は完了ですが、復元させるためにデータベースに保存する項目はIVキーと暗号化されたデータとなります
IVキーとは『単に暗号化ルーチンに異なる初期値を与えるためだけのもの』ということで、一緒に保存して構いません
重要なのはパスフレーズの方です。パスフレーズまで漏れると誰でも復元できてしまうようになります

今回はPHPの内部にパスフレーズを記述していますが、FTPサーバから不正侵入された場合にはファイルを直接参照されてしまいますので、サーバ内の外部からアクセスできない場所に文字列を保存したファイルを置いておき、includeなどで呼び出した方がセキュリティとしては高まります
例)
/var/etc/security/hoge など

データベースに保存するのはIVキーと暗号化されたデータになりますが、この2つの値はどちらともバイナリデータです
保存するにはカラムのデータ形式をバイナリに指定していてもいいですが、バイナリデータとして保存するとSQLで抽出した際の視認性が好きじゃないということでBase64でエンコードした値を保存するようにしています

バイナリーだとこんな感じに見えるのが
M�(���z��53�a

Bace64でエンコードすると
TaB/KMTUA/Z66scGNTMWsGE8RdrSgPwraNRtcWRLmCQ=

みたいになります

Base64でエンコードしたデータはデコードでそのまま復元できますし、カラムの形式もVARCHAR型で構いませんので難しいことを考えなくてもよくなります

Base64にエンコードするには

この値をデータベースに保存すれば暗号化処理の完成です

続いては復元の方法です

パスフレーズの設定を細かくするかどうかにもよりますが、そんなに複雑な処理もなく重要な情報を復元できる形で暗号化できますので、万が一に備えて暗号化を進めていくのもいいかもしれません