AuthComponent がどの方式でパスワードをハッシュ化しているか
どの方式でハッシュ化しているのか
CakePHP はログイン認証に使うパスワードを自動的にハッシュ化してDBに格納してくれて便利なのだが、どの方式でハッシュ化しているのかがわかりにくい。 調べた結果、自分の環境だと、sha1 だった。
どのように調べたかをいかに記す。 他のアプリケーションで使う場合とかフレームワークを変えた場合とかに役に立つのではなかろうか。
CakePHP のAuth認証のコードを見るとわかる
CakePHP のAuth認証周りの設定は /lib/Cake/Controller/Component/Auth/BaseAuthenticate.php
にある。
CakePHP のAuthComponentの $settings
最後に'passwordHasher' => 'Simple'
とある。これがデフォルトの値である。
では、'Simple'とはなんぞやという疑問が当然浮かんでくる。今回はこれを見ていく。
'Simple'と記述すると、パスワードの照合にSimplePasswordHasher
クラスが呼ばれる仕組みになっている。
ファイルのパスは以下だ。
/lib/Cake/Controller/Component/Auth/SimplePasswordHasher.php
つまり上記の $settings に'passwordHasher' => 'Xxx'
と書けばXxxPasswordHasher.php
クラスが呼ばれる仕組みだ。
独自のPasswordHasherを定義したければ、この $settings の記述と/app/Controller/Component/Auth/
以下にXxxPasswordHasher.php
の追加を行えばよい。
具体的な書き方に関しては以下を参考にするとよさ気だ。 CakePHP2.4でpasswordHasherクラスを変更する方法
さて、話をSimplePasswordHasher
クラスに戻そう。
このクラスにhash($password)
というメソッドを持つ。これがパスワードのハッシュ化を行うメソッドだ。
CakePHP 2.4 でパスワードのハッシュ化を行っているメソッド
中身は単純で、Security::hash()
を呼び出し、戻り値をそのまま返しているだけだ。
Security::hash()
というのは/lib/Cake/Utility/Security.php
の中にあるhash()
のことである。
処理を見てみると、$type の値に応じてハッシュ化を行う種類を決めているだけだ。
if (!$type || $type === 'sha1') { if (function_exists('sha1')) { return sha1($string); } $type = 'sha256'; }
どのタイプに決まるかは環境によるとしかいえないが、自分の場合は$type
の値はnull のまま渡されてきたので、function_exists('sha1')
、つまりsha1()
が存在すればsha1でハッシュ化しなさいよという条件に引っかかったのでsha1
になった。
もし、sha1()
がなければsha256
に決まるようだ。
強度で言えば、sha256(sha2)
> sha1()
なのだが。
https://jp.globalsign.com/sha256/knowledge/
以上で、AuthComponent がどの方式でパスワードをハッシュ化しているかがわかった。
[参考]
認証 — CakePHP Cookbook 2.x ドキュメント
CakePHP2.4でpasswordHasherクラスを変更する方法