Blowfishを使用してハッシュ化する

使用方法

Blowfishを採用してハッシュ化を行う場合、Securityクラスのhashメソッドを呼び出します。第2引数に'blowfish'を指定し、第3引数を指定しないもしくはfalseにします。

$plain_for_blowfish = 'strengthpassword';
$hashed_by_blowfish = Security::hash( $plain_for_blowfish, 'blowfish');

'blowfish'を指定するとphpのcryptを使用します。lib/Cake/Utility/Security.phpの_cryptを参照。

cryptの第二引数にはsaltを指定しますが、Cake側から以下のように作成されて渡されます。
まず、/app/Config/core.php内に指定されている'Security.salt'にuniqueidを掛け、sha1でハッシュ化を行い、base64エンコードしています。そして、'+','='を'.'に置換して先頭22バイトを切り取っています。最後に、先頭にプレフィックス"$2a$"と後述するハッシュコストが付与されます。lib/Cake/Utility/Security.phpの_saltを参照

phpでは、saltの文字列が以下の条件の場合にblowfishアルゴリズムが使用されます。

// /ext/standard/crypt.c
 if (
                salt[0] == '$' &&
                salt[1] == '2' &&
                salt[2] >= 'a' && salt[2] <= 'z' &&
                salt[3] == '$' &&
                salt[4] >= '0' && salt[4] <= '3' &&
                salt[5] >= '0' && salt[5] <= '9' &&
                salt[6] == '$') {

PHP: crypt - Manual
CRYPT_BLOWFISH - Blowfish ハッシュ。salt の形式は、 "$2a$" か "$2x$" あるいは "$2y$"、2 桁のコストパラメータ、"$"、そして文字 "./0-9A-Za-z" からなる 22 文字となります。 この範囲外の文字を salt に使うと、crypt() は長さゼロの文字列を返します。 2 桁のコストパラメータは反復回数の 2 を底とする対数で、 これは Blowfish ベースのハッシュアルゴリズムで使います。 この値は 04 から 31 までの範囲でなければならず、 それ以外の値の場合は crypt() は失敗します。 5.3.7 までのバージョンの PHP では、salt のプレフィックスとして "$2a$" だけしか使えませんでした。PHP 5.3.7 で新たなプレフィックスが導入され、 Blowfish の実装にあったセキュリティ上の弱点に対応しました。 セキュリティ修正の対応の詳細については » この文書 を参照ください。 簡単にまとめると、PHP 5.3.7 以降しか使わないのなら "$2a$" ではなく "$2y$" を使うべきだということです。

2つ目のパラメータにあたる「コストパラメータ」はハッシュ化する際の計算の繰り返し回数になり、2の乗数になり、処理時間と複雑性を天秤にかけることになります。
CakePHPでは、デフォルトは「10」に設定されていますが、「04 から 31 までの範囲」(5以上30以下)で設定することができます。

// /app/Controller/AppController.php
class AppController extends Controller {
    public function beforeFilter() {
        Security::setCost(14);
    }
}
Securityユーティリティ:lib/Cake/Utility/Security.php
Utilities > Security > hash // 2.3 2.4
  • このエントリーをはてなブックマークに追加

関連記事

Syslogログエンジン

2.4から「Syslog」ログクラスが追加され、簡単にSyslogを使用できるようになりました。 CakePHP側の設定はbootstrap.php内のCakeLogコンフィグのengineを'Sy

RSSフィードの取得

コンロトーラ public function getrssfeed() { try { $newsItems = $this->Rss->read( 'http://

ログインに追加の条件を付与する「scope」

ユーザ登録では、仮登録処理(status=1)から送付したメール内のリンクをクリックしてもらい本登録(status=0)を行ってもらう実装をしました。仮登録の状態ではログインできないように実装するには

CSS/JSをひとまとめにして軽量化するプラグイン「Minify plugin for CakePHP」

「Minify plugin for CakePHP」は、インクルードするCSSもしくはJSファイルをひとまとめにしてキャッシュ化してくれるプラグインです。 導入 ダウンロード・解凍し

Formヘルパーのinputタグのdiv/labelなどの設定

Formヘルパーのinputではデフォルトでは以下のようにdivで囲われて、labelが付与されて出力されます。 CSSのフレームワークなどであらかじめ決まったスタイルがある場合に便利に作られていま

ユーザ登録(仮登録・メール・本登録)

以前1.3版で投稿した「ユーザ登録」処理の2.x版を作成しました。フローは同じで以下のようにします。 1. メールアドレス・パスワードでユーザ登録 2. この時点では仮登録として、本登録用のU

パス定数と変更方法やURLの取得

CakePHPは基本的にはディレクトリそのまま配置することで構築が可能ではありますが、設定パスを変更することでセキュリティに考慮した構成にすることや運用性をもたせたものにすることが可能になります。

CakePHP 2.x インストール

現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ

hasOne アソシエーション

hasOneアソシエーションはテーブル間で1つのレコードに対して他のテーブルに紐付くレコードが1つの場合にjoinする場合に使用します。 CakePHPのドキュメントにならってUserモデルとP

CakePHP インストール時エラーの対処

CakePHPインストール時に出くわすであろうエラーの原因と対処方法についてまとめてみました。前提として、WebサーバはApache、データベースはMySQLとしています。 Timezone未設

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑