AuthComponentのパスワード暗号化を無効にする方法

1.2系で追加されたAuthComponentは、認証関連の処理を一手に担ってくれる強力なコンポーネントですが、

等で紹介されているように、パスワードが自動で暗号化されるために注意が必要です。

上記のサイトでは暗号化の処理の注意点、暗号化される値の事前の算出方法などが紹介されていますが、今回は暗号化自体をしない方法はないかを探ってみました。

暗号化の回避方法

AuthComponentのソースを追ってみたところ、独自の暗号化処理を組み込める仕組みが用意されていました。

AuthComponentのauthenticateプロパティに、hashPasswordsというメソッドを持つオブジェクトをセットすれば、暗号化の処理をセットしたオブジェクトのhashPasswordsメソッドが行うようになっています。

なので、このauthenticateプロパティに暗号化を行わないようにするオブジェクトをセットすればよいということになります。

ということで、サンプル

以下のサンプルは、独自のコンポーネント(NoHashComponent)をauthenticateプロパティにセットする方法です。

独自のコンポーネントといっても、何もせずにパスワードをそのまま返すだけのコンポーネントですが。。。

【app/controllers/app_controller.php

<?php
class AppController extends Controller {
	
    // コンポーネントを読み込む
    var $components = array('Session', 'Auth', 'NoHash');

    function beforeFilter(){
        if (isset($this->Auth)) {
            $this->Auth->authenticate = $this->NoHash;
            //以下、その他のAuthComponentの設定など
        }
    }
	
}
?>

【app/controllers/components/no_hash.php

<?php
class NoHashComponent extends Object {
    /**
     * 暗号化しないでそのまま返す
     */
    function hashPasswords($data){
        return $data;
    }
}
?>


これで、ユーザ登録時やログイン認証時にパスワードが暗号化されなくなります。

まとめ

パスワードはセキュリティのためにも暗号化した方が良いことは言うまでもありませんが、デバッグ環境ではパスワードを暗号化しない方が作業効率が良い場合もあるかと思います。(テーブルを直接覗けばパスワードもそのまま見えるので。)

そんな時に、上記の設定をデバッグレベルによって振り分ける(暗号化する/しない)のもアリかな?と思ったエントリーでした。