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

関連記事

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

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

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

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

RSSフィードの取得

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

SQLクエリーをログに出力する

SQLのクエリーをデバッグするには、Debug Kitを使用すればできますが、デバッグログと一緒に出したいのでやり方を調査してみました。 別々のログやビューでみるのもいいですが、秒単位で実行される処

Jsヘルパーを使用してAjax更新

更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ head

hasOne アソシエーション

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

FormヘルパーのMagicOption (マジックオプション) 

Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある

複数ファイルアップロードフォーム

CakePHP 2.0からはHTML5が標準でサポートとなり、複数ファイルアップロードのためのフォーム記述が容易になりました。 View (ビュー) 配列 Array (

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

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

no image

HttpSocketを使用してリクエスト送信

CakePHPには、Webサービスへのリクエスト送信のためのHttpSocketクラスが用意されています。 HttpSocket get HTTP GETリクエストを発行します。デモ H

Message

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

*

PAGE TOP ↑