読者です 読者をやめる 読者になる 読者になる

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()のことである。

CakePHP のハッシュ生成メソッド

処理を見てみると、$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クラスを変更する方法

SHA-1・SHA-2とは│SHA-2電子証明書への移行│SSL・電子証明書ならGMOグローバルサイン

CakePHPで学ぶ継続的インテグレーション