Ce face crypt
crypt este funcția veche de hash pentru parole, compatibilă cu sistemele Unix. Algoritmul se alege după începutul sării: $2y$ bcrypt, $6$ SHA-512, $5$ SHA-256. O sare din două caractere obișnuite înseamnă vechiul DES, complet nesigur.
Rezultatul conține sarea, așa că verificarea se face dând hash-ul salvat drept sare: hash_equals($hash, crypt($parola, $hash)). password_hash folosește intern același mecanism, dar alege singur sarea și algoritmul. Hash-urile create cu crypt pot fi verificate și cu password_verify.
Parametri
| Parametru | Descriere |
|---|---|
$string |
Parola. |
$salt |
Sarea, care stabilește și algoritmul, de exemplu "$6$rounds=5000$sarebuna$". |
Ce returnează
Hash-ul, care începe cu sarea folosită.
Exemple
Exemplul 1: SHA-512 și verificarea
<?php
$hash = crypt("parola", '$6$rounds=5000$sarebuna$');
echo $hash . "\n";
var_dump(hash_equals($hash, crypt("parola", $hash)));
var_dump(password_verify("parola", $hash));
Rezultat
$6$rounds=5000$sarebuna$u3kLZGmpCWL7cyP23eWQPUqD6jiNyL3yOI2gIqpW3Q3ptj5t6ITB8QLl/YmnmHklUuIYHrLlEJyYMbpS80NfB0
bool(true)
bool(true)
Exemplul 2: Hash-uri vechi verificate la autentificare
Un site vechi poate avea parole salvate cu crypt. password_verify le recunoaște, iar password_needs_rehash spune că trebuie refăcute.
<?php
$vechi = crypt("Ana#2026!", '$6$rounds=5000$sareveche$');
if (password_verify("Ana#2026!", $vechi) && password_needs_rehash($vechi, PASSWORD_DEFAULT)) {
$nou = password_hash("Ana#2026!", PASSWORD_DEFAULT);
echo "Hash actualizat: " . substr($nou, 0, 7) . "...";
}
Rezultat
Hash actualizat: $2y$12$...
Greșeli frecvente
- Dai o sare scurtă, de exemplu
crypt($parola, "ab"). Se folosește DES, care ia în calcul doar primele 8 caractere ale parolei. Foloseștepassword_hash. - Folosești aceeași sare fixă pentru toți utilizatorii. Două parole identice dau același hash. Sarea trebuie să fie aleatorie pentru fiecare parolă.
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.hash_hmac / hash_equals: Calculează o semnătură HMAC: o amprentă care depinde și de o cheie secretă. Dovedește că datele nu au fost modificate.