laravel12.laravel_033
最終投稿日:2026年3月1日
③ペッパー文字列とは、設定ファイル等による固定文字列の事です。
つまり、固定文字列の「ペッパー」と、動的文字列の「ソルト」で強力な【味付け】をするわけです。
この重装備で、レインボーテーブル攻撃を迎え撃ちます。
※ ハッシュ化されたパスワードを効率的に逆引きする攻撃手法です
<?php
namespace App\Utility;
class SystemUtil{
// ハッシュ文字列作成
public static function getHash512($str, $flg = false) {
$hash = hash('sha512', $str, $flg);
return $hash;
}
// ランダムな文字列を生成する
public static function getRandomStr($length = 16) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$bytes = random_bytes($length);
$charLength = strlen($chars);
$result = '';
for ($i = 0; $i < $length; $i++) {
$result .= $chars[ord($bytes[$i]) % $charLength];
}
return $result;
}
// パスワード生成
public static function createHashPassword($password) {
// ペッパー文字列取得
$pepper_str = config('app.pepper_str');
// ソルト文字列取得
$salt_str = self::getRandomStr();
$plain_password = $pepper_str . '$' . $salt_str . '$' . $password;
// パスワードハッシュ化
$hash_password = self::getHash512($plain_password);
return $salt_str . '$' . $hash_password;
}
// パスワード確認
public static function checkPassword($inputPassword, $hashPassword) {
// ソルト文字列、パスワードを分解
list($salt_str, $check) = explode('$', $hashPassword);
// ペッパー文字列取得
$pepper_str = config('app.pepper_str');
$plain_password = $pepper_str . '$' . $salt_str . '$' . $inputPassword;
// パスワードハッシュ化
$hash_password = self::getHash512($plain_password);
return $hash_password == $check;
}
}
use App\Utility\SystemUtil;
~ 省略 ~
public function index(Request $request){
$pass = SystemUtil::createHashPassword('input_password');
$check = SystemUtil::checkPassword('input_password', $pass);
var_dump($check);exit;
return view('hoge/index', ['title'=>'任意の画面']);
}
<?php
namespace App\Services;
class Sha512Hasher {
// パスワード生成
public function make($value, array $options = []) {
var_dump('パスワード生成');exit;
}
// パスワードチェック
public function check($value, $hashedValue, array $options = []) {
var_dump('パスワードチェック', $value, $hashedValue);exit;
}
// パスワードリフレッシュ
public function needsRehash($hashedValue, array $options = []) {
return false;
}
}
<?php
return [
'driver' => 'sha256',
];
<?php
namespace App\Services;
use App\Utility\SystemUtil;
class Sha512Hasher {
// パスワード生成
public function make($value, array $options = []) {
return SystemUtil::createHashPassword($value);
}
// パスワードチェック
public function check($value, $hashedValue, array $options = []) {
return SystemUtil::checkPassword($value, $hashedValue);
}
// パスワードリフレッシュ
public function needsRehash($hashedValue, array $options = []) {
return false;
}
}
認証のカスタマイズにより、自動生成された以下内容は不要となります。
《WEB_ROOT》
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware): void {
$middleware->redirectGuestsTo(function ($request) {
return route('index');
});
})
->create();
少し余談ですが、たまにパスワード忘れで、メールからパスワードを再設定するシステムがありますよね。
知らないのに何でログイン処理が出来るかって?あれ、「再設定じゃなくて登録してたパスワード教えてくれよ」って思った事ありませんか?
実はあなたのパスワードってサービスの運営側の誰一人として知らないんです。
それは運営側が知っているのは、あなたのパスワードをハッシュ化した後の文字列だからです。
決まったパスワードを決まった方法でハッシュ化するので認証処理が可能なわけです。
ハッシュ化は不可逆の性質を持っているためハッシュ文字列が分かっても、平文のパスワードは分からないって事です。