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
  • このエントリーをはてなブックマークに追加

関連記事

Markdown Plugin

「Markdown CakePHP Plugin」は、MarkDown書式をレンダリングしてくれるビューヘルパーです。MarkDownについて勉強しているうちに出会ったので試し打ちです。 ダウンロー

バリデーションエラーメッセージの取得

CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.

Syslogログエンジン

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

FullCalendarを使用してカレンダーアプリケーション

カレンダーアプリケーションを作成するため、カレンダー表示できるプラグインを探索して出会ったFullcalendarを試してみました。シンプルに使用できる上に、オプションがかなり豊富です。ダウンロード

入力文字列の長さ(文字数)をバリデーション

CakePHP 2には、コアバリデーションに文字列の長さを検証する関数が用意されています。 文字列長(コア)バリデーション minLength - 最小文字数以上であること maxLengt

recursive設定によるfind()性能改善

CakePHPでは、モデルにアソシエーションを設定している場合、recursive(=>joinする階層)はデフォルトで0に設定されています。「recursiveゼロ」の意味するところとは、「1跨ぎま

DebugKitを導入

定番のブログチュートリアルをこなして、定番のDebugKitを導入してみました。 2.3からはCakePHPインストール直後に以下のように導入を推奨するような警告メッセージが表示されるようになりまし

RSSフィードの取得

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

数値系バリデーション

CakePHP 2になっていくつか数値用バリデーションルールが追加されています。 数値用 (コア)バリデーション decimal - 十進数であること numeric - 数値であること

コントローラ内でバリデーション処理を呼び出す

CakePHPでは、saveメソッドの際にバリデーション処理も自動で行われますが、save処理と切り離してバリデーションを行うこともできます。このときは、save時と若干異なる処理体系になります。

Message

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

*

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

    PAGE TOP ↑