PHP

Laravel5.4の認証ユーザーのパスワードハッシュについて

Laravel で用意されている認証モジュールを利用する際、ユーザーモデル(User.php)経由で登録されるパスワードのハッシュ方法について調べてみました。

パスワードのハッシュ方式

Laravel 上ではパスワード文字列を bcrypt() のヘルパーでハッシュしています。

このヘルパーの中身を追いかけてみると、要は PHP 標準の password_hash() を使っていることがわかります。

引数の 1 番目はパスワード文字列、2 番目はアルゴリズムですが、アルゴリズムには「PASSWORD_BCRYPT」を利用しています。

実際に、パスワードの入力でそこまで文字数を許容することはないと思いますが、この「PASSWORD_BCRYPT」を指定した場合は、パスワード文字列は 72 文字で切り詰められますので注意が必要です。

password_hash()のハッシュ関数の特徴

これまでに、よく利用されていたハッシュ関数である md5() や sha1() の場合は、1 つの文字列に対して、同じハッシュ文字列が生成されますが、password_hash() の場合は、毎回異なったハッシュ文字列が生成されます。

ハッシュについてはレインボーテーブルのこととか、説明すると長くなるのでここでは割愛しますが、この password_hash() で生成されたハッシュ文字列と実際の生パスワードが一致しているかどうかは、md5 や sha1 の時と違って、単なる文字列比較ではできません。

この場合、password_verify() 関数で、パスワードがハッシュにマッチするかどうかを確認します。

先ほど発行した最後のハッシュ文字列を例にして、phash.php というファイル名でパスワードのチェックのサンプルを作成してみました。

実行結果は以下の通りです。