CakePHP::mcrypt用(暗号化)のコンポーネント
7月 16th, 2007 admin Posted in CakePHP, PHP | 2 Comments »
個人情報を扱うアプリケーションなどで、万が一データベースの中身が抜かれても(復号キーさえ盗まれなければ)(ほぼ)大丈夫なようにデータを暗号化して保存しておくことを考えてみた。
ダウンロード
cakephp_components_mcrypt.zip
cakephp_components_mcrypt1.zip v0.2
準備
通常はVMWAREなどでテスト環境を作って開発を行うのだけど、今回はお手軽にXAMPPを使っている。
XAMPPのphp.iniはなぜか3つあり、mcryptを有効にするまで3つとものextension=php_mcrypt.dllを有効にした。(たぶんどれか必要ない)
c:\xampp\bin\php.ini c:\php\php.ini c:\php\php4\php.ini
でapacheを再起動
debianだと
apt-get install php5.1-mcrypt apache2 -k graceful
だけでOK。
mcryptが使えない人にはPEAR::Crypt_Blowfishがあるが、これはブロック暗号化モードでECBモードしか選べないということなので十分に安全とはいえないので注意。
設置
/app/controllers/components/mcrypt.php
に置くだけ
使用例
/app/controllers/users_controller.php
class UsersController extends AppController {
var $name = 'Users';
var $components = array("Mcrypt");
function index(){
$test = "VISA::0011-2233-4455-6677::日本タロウ";
$encrypt = $this->Mcrypt->encrypt($test);
$decrypt = $this->Mcrypt->decrypt($encrypt);
echo $encrypt."";
echo trim($decrypt)."";
}
}
出力
�pZ�s ���Du�n���"��SE�"�Q{x����u�b
VISA::0011-2233-4455-6677::日本タロウ
参考サイト
mcrypt 関数 (コロンブスの卵)
ブロック暗号モード(block cipher mode) triplefalcon
人力検索 PHPでの文字列暗号化で、どの暗号種類を使ってよいかわかりません・・・
Todo
- row_keyを置く場所は、apacheしかアクセスできない場所がよい
mysqlに保存するときは
もし MySQL データベースにデータを格納する場合は、 varchar フィールドに値を挿入する際に末尾のスペースが取り除かれることを 覚えておきましょう。暗号化されたデータの最後にスペース(ASCII 32)が 含まれていた場合、この処理によってデータが破壊されてしまいます。 かわりに tinyblob/tinytext (あるいはより大きな) フィールドを 使用してください。
2007/07/16 追記
初期化ベクトルIVを毎回初期化していたのですが、セッションをまたぐ場合にIVの値が違うと復号できないので固定に修正。
phpマニュアルでは固定では駄目なようなことが書いてあるが、そのコメントのところでは「それは間違っている」と書いてある。
僕も間違っていると思うのだが・・・
7月 26th, 2007 at 0:17:55
MySQLのテーブルに暗号化した文字列を格納しようと悪戦苦闘しています。次のsave処理で必ずエラーになります。
$this->data['User']['user_password'] =
$this->Mcrypt->encrypt($this->data['User']['user_password']);
$this->User->save($this->data);
フィールドのデータ型は、varchar, text, tinyblob,blob と試しましたが、どれもダメです。Pearのいくつかの暗号化/復号化ライブラリも試しましたがどれもダメでした。プレーンテキストの場合は問題ありません。
お知恵を拝借したく、お願いいたします。
7月 26th, 2007 at 9:50:09
自己レスです。
保存ができないのはValidationのせいでした。
お騒がせしました。