イントロダクション
LaravelのHashファサードは保存するユーザーパスワードに対し、安全なBcryptとArgon2ハッシュを提供します。Laravelアプリケーションに組み込まれている、LoginController
とRegisterController
を使用していれば、登録と認証で自動的にBcrypt使用します。
Tip!! Bcryptは「ストレッチ回数」が調整できるのでパスワードのハッシュには良い選択肢です。つまりハードウェアのパワーを上げればハッシュの生成時間を早くすることができます。
設定
アプリケーションのデフォルトハッシュドライバーは、config/hashing.php
設定ファイルで指定します。現在、Bcryptおよび、Argon2(Argon2iとArgon2id)の3ドライバーをサポートしています。
Note: Argon2iドライバーはPHP7.2.0以上、Argon2idドライバーはPHP7.3.0以上が必要です。
基本的な使用法
Hash
ファサードのmake
メソッドを呼び出し、パスワードをハッシュできます。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class UpdatePasswordController extends Controller
{
/**
* ユーザーパスワードを更新
*
* @param Request $request
* @return Response
*/
public function update(Request $request)
{
// 新しいパスワードの長さのバリデーション…
$request->user()->fill([
'password' => Hash::make($request->newPassword)
])->save();
}
}
BcryptのWork Factorの調整
Bcryptアルゴリズムを使用する場合、make
メソッドでrounds
オプションを使用することにより、アルゴリズムのwork
factorを管理できます。しかし、ほとんどのアプリケーションではデフォルト値で十分でしょう。
$hashed = Hash::make('password', [
'rounds' => 12,
]);
Argon2のWork Factorの調整
Argon2アルゴリズムを使用する場合、memory
とtime
、threads
オプションを指定することにより、アルゴリズムのwork
factorを管理できます。しかし、ほとんどのアプリケーションではデフォルト値で十分でしょう。
$hashed = Hash::make('password', [
'memory' => 1024,
'time' => 2,
'threads' => 2,
]);
Tip!! これらのオプションの詳細情報は、PHP公式ドキュメントをご覧ください。
パスワードとハッシュ値の比較
check
メソッドにより指定した平文文字列と指定されたハッシュ値を比較確認できます。しかしLaravelに含まれているLoginController
を使っている場合は、これを直接使用することはないでしょう。このコントローラがこのメソッドを自動的に呼び出します。
if (Hash::check('plain-text', $hashedPassword)) {
// パスワード一致
}
パスワードの再ハッシュが必要か確認
パスワードがハシュされてからハッシャーのストレッチ回数が変更されているかを調べるには、needsRehash
メソッドを使います。
if (Hash::needsRehash($hashed)) {
$hashed = Hash::make('plain-text');
}