cakephp plugin CryptoDbをgithubで公開しました

github / ninton / cakephp.CryptoDb

特徴
1) 平文と暗号キーがMySQL binlogに残りません。

2) ivを毎回生成します。そのため同じ平文、同じキーで暗号化しても同じ結果になりません。
(暗号データにivを含んでいます)

----------------------------------------
MySQL field type	CryptoDb support
----------------------------------------
text			recommended
varchar(255)		plaintext length <= 32

----------------------------------------
設定手順
----------------------------------------
YourModel.messageを暗号化してDB保存したい場合

1) edit App/Config/bootstrap.php

CakePlugin::loadAll(array(
  'CryptoDb' => array('bootstrap' => true),
));

2) create plugins/CryptDb/Config/bootstrap.php

Configure::write( 'CryptoDb.cryptoKey', 'Your Cryptography Key' );

plugins/CryptDb/Config/bootstrap.sample.phpも参照してください。

*注意*
サービスを開始したら、暗号キーを変更してはいけません。
古いキーで暗号化したフィールドは、新しいキーで復号できません。

3) edit App/Model/YourModel.php

App::uses()、extends Crypto、$cryptoFieldsの3点を編集してください。

App::uses('Crypto', 'CryptDb.Crypto');
class YourModel extends Crypto {
    public $cryptoFields = array(
        'message'
    );

4) call save() and find()

暗号/復号処理を記述する必要はありません。

// save()に平文を渡してください。
$data['YourModel']['message'] = 'This is my secrets';
$YourModel->save( $data );

// find()を呼ぶと、平文が返ってきます。
$data = $YourModel->find('first');
echo $data['YourModel']['message'];
--> 'This is my secrets'

phpMyAdmin (or mysql command) で直接データベースを見ると、暗号化されています。
--> 'a:4:{s:4:"algo";s:12:"rijndael-256";s:4:"mode";s:3:"cbc";s:2:"iv";s:44:"56...'

----------------------------------------
CakeTest fixture
----------------------------------------
CakeTestのfixtureには、暗号化したデータを記述してください。
記述したとおりにINSERTされます。

----------------------------------------
暗号化せずに、saveする方法
----------------------------------------
save()ではなく、saveAll()を使います。

$params['callbacks'] = false;
$this->saveAll($data, $params);

----------------------------------------
復号せずに、findする方法
----------------------------------------

// way-1.
$this->virtualFields['hoge_raw'] = 'hoge';
$data = $this->find('all', $params);
		
// way-2. 
unset($this->cryptoFields['hoge']);
$data = $this->find('all', $params);