Writing Some Code

2008-03-11

[]AuthComponentのパスワード暗号化を無効にする方法 23:29 AuthComponentのパスワード暗号化を無効にする方法を含むブックマーク 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;
    }
}
?>

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

まとめ

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

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

redgasuki@ne2ma2.comredgasuki@ne2ma2.com 2008/03/12 08:50 トラックバックありがとうございます。
AuthComponentは、独自の暗号化処理を組み込めるんですね。
開発時も役に立ちそうですが、
すでに自分でユーザ認証(独自の暗号化処理)を
作っている場合の移行に役に立ちそうですね。

ngtnngtn 2008/03/12 22:53 その視点は自分には無かったですが、確かに移行する場合にも役に立ちそうですね。