Метод needsRehash
Метод needsRehash класса Hash позволяет определить, нужно ли перехешировать уже сохранённый хеш пароля. Это особенно важно при изменении параметров хеширования (например, увеличение стоимости вычислений), чтобы повысить безопасность системы. Метод принимает хеш пароля в качестве аргумента и возвращает true, если хеш устарел и требует обновления, или false, если хеш соответствует текущим настройкам.
Синтаксис
<?php
Hash::needsRehash($hashedValue);
?>
Параметры
Метод принимает один обязательный параметр:
-
$hashedValue- строка, содержащая хешированный пароль, который необходимо проверить.
Пример
Давайте проверим, нужно ли перехешировать пароль пользователя при его входе в систему:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function login(Request $request)
{
$user = User::where('email', $request->email)->first();
if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
if (Hash::needsRehash($user->password)) {
$user->password = Hash::make($request->password);
$user->save();
}
return response()->json(['message' => 'Login successful']);
}
}
?>
Результат выполнения кода при успешном входе:
{"message":"Login successful"}
Пример
Давайте явно проверим хеш, созданный со старой стоимостью, и увидим, что метод вернёт true:
<?php
use Illuminate\Support\Facades\Hash;
// Старый хеш с меньшей стоимостью
$oldHash = '$2y$10$abcdefghijklmnopqrstuvwxyz1234567890';
$res = Hash::needsRehash($oldHash);
echo $res ? 'true' : 'false';
?>
Результат выполнения кода:
"true"
Пример
Давайте создадим новый хеш с текущими настройками и проверим его:
<?php
use Illuminate\Support\Facades\Hash;
$password = 'secret123';
$newHash = Hash::make($password);
$res = Hash::needsRehash($newHash);
echo $res ? 'true' : 'false';
?>
Результат выполнения кода:
"false"
Пример
Метод needsRehash также полезен при массовом обновлении паролей пользователей в фоновом режиме:
<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class RehashPasswords extends Command
{
protected $signature = 'passwords:rehash';
protected $description = 'Rehash outdated passwords';
public function handle()
{
$users = User::where('active', true)->get();
$count = 0;
foreach ($users as $user) {
if (Hash::needsRehash($user->password)) {
$user->password = Hash::make($user->password);
$user->save();
$count++;
}
}
$this->info("Rehashed {$count} passwords");
}
}
?>
Результат выполнения команды:
"Rehashed 5 passwords"