crypt()
La funzione crypt() esegue l'hashing unidirezionale di una string in PHP. Scopri sintassi, algoritmi e come verificare le password.
La funzione PHP crypt() esegue l'hashing unidirezionale di una string. "Unidirezionale" significa che puoi trasformare una password in un hash, ma non puoi ricavare dall'hash la password originale — esattamente ciò che serve per memorizzare le password. Questa pagina tratta la sintassi, i formati del salt che selezionano ciascun algoritmo di hashing, come verificare un hash memorizzato e perché il codice moderno dovrebbe preferire password_hash().
Sintassi
crypt(string $string, string $salt = ""): stringLa funzione accetta due parametri:
$string— il testo di input che vuoi sottoporre a hashing.$salt— una string che seleziona l'algoritmo di hashing e fornisce byte casuali che fanno sì che password identiche producano hash diversi. Il salt è opzionale, ma ometterlo non è sicuro (viene generato un avviso da PHP 8.0): passa sempre un salt esplicito.
Il valore restituito è la string con l'hash. I primi caratteri del risultato codificano il salt e l'algoritmo, quindi l'hash è autodescrittivo — puoi memorizzarlo così com'è e crypt() sarà in grado di riprodurlo in seguito.
Un esempio di base
Qui passiamo una string e un salt a crypt(), che restituisce l'hash. Con il salt "ab", l'output è l'hash DES standard:
abJnggxhB/yWINota che i primi due caratteri dell'output (ab) sono il salt stesso — è così che crypt() ricorda quale algoritmo e quale salt hanno prodotto l'hash.
Formati del salt e algoritmi
La forma del salt indica a crypt() quale algoritmo utilizzare. Questo è l'aspetto più importante da capire sulla funzione:
| Prefisso del salt | Algoritmo | Note |
|---|---|---|
(2 caratteri, senza $) | DES | Legacy, debole — solo i primi 8 caratteri della password sono rilevanti. Da evitare. |
$1$ | MD5 | Vecchio; non usare per nuove password. |
$5$ | SHA-256 | |
$6$ | SHA-512 | Robusto; supporta un costo rounds=. |
$2y$ | Blowfish (bcrypt) | L'algoritmo consigliato per crypt(). Formato: $2y$<costo>$<salt di 22 caratteri>. |
Un esempio bcrypt con un costo esplicito di 10:
<?php
$hash = crypt("password123", '$2y$10$usesomesillystringforsalt$');
echo $hash;
?>L'output inizia con $2y$10$, registrando l'algoritmo e il costo in modo che l'hash possa essere verificato in seguito:
$2y$10$usesomesillystringforeSNzFqnuq1h/v0NITsGcb4b3qwzSfNIaVerifica di una password
Per confrontare una password con un hash memorizzato, esegui l'hashing del candidato usando l'hash memorizzato come salt. crypt() legge l'algoritmo e il salt dall'hash, quindi riproduce automaticamente gli stessi parametri:
Output:
Password is valid!Usa hash_equals() invece di == per il confronto — viene eseguita in tempo costante e previene gli attacchi di temporizzazione che potrebbero rivelare informazioni sull'hash.
Quando usarla (e cosa usare al suo posto)
crypt() è uno strumento legacy di basso livello. È facile usarla in modo errato: un salt troppo corto, il prefisso sbagliato o il formato DES obsoleto producono tutti hash deboli. Per il nuovo codice, preferisci gli helper di livello superiore che wrappano crypt() e gestiscono la generazione del salt e la selezione dell'algoritmo per te:
<?php
$hash = password_hash("password123", PASSWORD_DEFAULT); // generates a strong bcrypt hash + random salt
if (password_verify("password123", $hash)) {
echo "Password is valid!";
}
?>password_hash() e password_verify() sono il metodo consigliato per memorizzare e verificare le password in PHP moderno. Ricorri a crypt() solo quando devi interoperare con un sistema esistente che già memorizza hash nel formato crypt().
Per l'hashing semplice non legato alle password (checksum, chiavi di cache, ETag), consulta le funzioni md5() e sha1() — nota che queste non sono adatte alle password. Per ulteriori utilità sulle string, consulta il riferimento alle funzioni string PHP.