password_needs_rehash în PHP

Verifică dacă un hash de parolă a fost creat cu alt algoritm sau alt cost decât cele actuale și trebuie refăcut.

Sintaxă
password_needs_rehash(string $hash, string|int|null $algo, array $options = []): bool

Ce face password_needs_rehash

Cu timpul, setările recomandate se schimbă: crește costul, apare un algoritm mai bun. password_needs_rehash compară hash-ul salvat cu setările pe care le folosești acum.

Momentul potrivit pentru actualizare este autentificarea: abia atunci ai parola în clar. După un password_verify reușit, dacă password_needs_rehash returnează true, calculezi un hash nou și îl salvezi.

Parametri

Parametru Descriere
$hash Hash-ul salvat.
$algo Algoritmul folosit acum, de obicei PASSWORD_DEFAULT.
$options Opțional. Opțiunile folosite acum, de exemplu ["cost" => 12].

Ce returnează

true dacă hash-ul trebuie refăcut, altfel false.

Exemple

Exemplul 1: Hash vechi, cu cost 10

<?php
$vechi = password_hash("parola", PASSWORD_BCRYPT, ["cost" => 10]);
$nou = password_hash("parola", PASSWORD_DEFAULT);

var_dump(password_needs_rehash($vechi, PASSWORD_DEFAULT));
var_dump(password_needs_rehash($nou, PASSWORD_DEFAULT));

Rezultat

bool(true)
bool(false)

Exemplul 2: Actualizare la autentificare

<?php
$parola = "Ana#2026!";
$hashSalvat = password_hash($parola, PASSWORD_BCRYPT, ["cost" => 10]);

if (password_verify($parola, $hashSalvat)) {
    if (password_needs_rehash($hashSalvat, PASSWORD_DEFAULT)) {
        $hashSalvat = password_hash($parola, PASSWORD_DEFAULT);
        // UPDATE utilizatori SET parola = ? WHERE id = ?
        echo "Hash actualizat: " . substr($hashSalvat, 0, 7) . "...\n";
    }
    echo "Autentificat.";
}

Rezultat

Hash actualizat: $2y$12$...
Autentificat.

Greșeli frecvente

  • Apelezi funcția înainte de password_verify și refaci hash-ul pentru o parolă greșită. Verifică întâi parola.

Comenzi înrudite

  • password_hash: Creează un hash sigur pentru o parolă, gata de salvat în baza de date. Este modul corect de a stoca parole.
  • password_verify: Verifică dacă o parolă introdusă se potrivește cu hash-ul creat de password_hash.