crypt în PHP

Calculează un hash de parolă cu algoritmul ales prin formatul sării. În cod nou folosește password_hash.

Sintaxă
crypt(string $string, string $salt): string

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ște password_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.