Lang x Lang

Hashing

Table of Contents

Introduction

Laravel の Hash facadeは、安全な Bcrypt と Argon2 hashing を提供し、userpassword の保存に使用します。もしあなたがLaravel アプリケーションのスターターキットのいずれかを使用している場合、Bcrypt は default として登録と authentication に使われます。

Bcrypt は、その work factor が調整可能であるため、 hashing passwords に最適な選択です。つまり、ハードウェアのパワーが増えるにつれて、 hash を生成する時間を増やすことができます。 hashing passwords の際には、遅い方が良いです。 algorithm が password を hash するのに時間がかかるほど、悪意のある users が全ての可能性のある string hash values の rainbow tables を生成するのに時間がかかります。これは、アプリケーションに対するブルートフォース攻撃に利用されるかもしれません。

Configuration

default で、Laravel は data をハッシュ化する際にbcrypt ハッシュ化 drivers を使用します。しかし、他にもいくつかのハッシュ化 drivers がサポートされています。これにはargon argon2id が含まれます。

あなたはHASH_DRIVERの環境 variables を使用して、application のハッシュ化 driver を指定することができます。しかし、Laravel のすべてのハッシュ化 driveroption をカスタマイズしたい場合は、config:publishの Artisan command を使用して、完全なhashing設定ファイルを公開するべきです。

php artisan config:publish hashing

Basic Usage

Hashing Passwords

password を hash するには、Hash facade のmake method を呼び出すことができます:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;

class PasswordController extends Controller
{
    /**
     * Update the password for the user.
     */
    public function update(Request $request): RedirectResponse
    {
        // Validate the new password length...

        $request->user()->fill([
            'password' => Hash::make($request->newPassword)
        ])->save();

        return redirect('/profile');
    }
}

Bcrypt ワークファクターの調整

あなたが Bcrypt の algorithm を使用している場合、makeの method を使用すると、roundsオプションを使用して algorithm のワークファクタを管理できます。ただし、 Laravel が管理する default のワークファクタは、ほとんどのアプリケーションにとって十分です。

$hashed = Hash::make('password', [
    'rounds' => 12,
]);

Argon2 ワークファクターの調整

あなたが Argon2 algorithm を使用している場合、make method を使用して、memorytime、およびthreadsオプションを使用して algorithm の作業要因を管理できます。ただし、 Laravel によって管理される default values は、ほとんどのアプリケーションにとって適しています。

$hashed = Hash::make('password', [
    'memory' => 1024,
    'time' => 2,
    'threads' => 2,
]);

NOTE

これらの options についての詳細は、公式 PHP ドキュメンテーションの Argon hashing に関する部分 をご参照ください。

Password が Hash と一致していることを確認する

Hash facade によって提供されるcheck method は、与えられた平文の string が与えられた hash に対応していることを確認することができます:

if (Hash::check('plain-text', $hashedPassword)) {
    // The passwords match...
}

Password が再ハッシュ化する必要があるかどうかの判定

Hashの facade によって提供されるneedsRehash method は、ハッシャーが使用するワークファクターが、 password がハッシュ化された時点から変更されたかどうかを判断することを可能にします。一部の applications は、applications の authentication process 中にこのチェックを行うことを選択します:

if (Hash::needsRehash($hashed)) {
    $hashed = Hash::make('plain-text');
}

Hash Algorithm Verification

ハッシュアルゴリズムの操作を防ぐため、Laravel の Hash::check method は、まず与えられたハッシュが application が選択したハッシュ化アルゴリズムを使用して生成されたものであることを検証します。もしアルゴリズムが異なる場合、RuntimeException 例外が throw されます。

これは、ほとんどのアプリケーションで予想される動作で、 hashing algorithm が変更されることが予期されておらず、異なるアルゴリズムは悪意のある攻撃の兆候である可能性があります。ただし、ある algorithm から別のものへ移行する場合など、 application 内で複数の hashing アルゴリズムをサポートする必要がある場合は、HASH_VERIFY の environment 変数を falseに設定することで、 hash algorithm の検証を無効にすることができます:

HASH_VERIFY=false

当社サイトでは、Cookie を使用しています。各規約をご確認の上ご利用ください:
Cookie Policy, Privacy Policy および Terms of Use