Attualmente sto lavorando a una "funzione di supporto" per il nucleo di PHP per rendere l'hashing delle password più sicuro e più semplice per la maggior parte degli sviluppatori. Fondamentalmente, l'obiettivo è renderlo così facile, che è più difficile inventare la propria implementazione piuttosto che usare quella core sicura. È anche progettato per essere aggiornato e ampliato in futuro con l'ottimizzazione dei metodi di hashing.
Ho scritto un RFC per l'aggiunta , e ho un implementazione delle funzioni .
La premessa di base è che crypt
è troppo difficile da utilizzare direttamente correttamente per la maggior parte degli sviluppatori. L'errore strano ritorna, il sale base-like (ma usando un alfabeto diverso), ecc. Quindi queste funzioni sono progettate per portare fuori quella congettura e fornire un'API semplice e sporca.
string password_hash(string $password, string $algo = PASSWORD_DEFAULT, array $options = array())
bool password_verify(string $password, string $hash)
string password_make_salt(int $length, bool $raw_output = false)
Password_Hash accetta una password, uno specificatore di algoritmo opzionale (al momento, solo l'implementazione CRYPT_BCRYPT
migliorata è supportata, ma vorrebbe aggiungere scrypt
come opzione in seguito) e una matrice di opzioni. L'array di opzioni può specificare il parametro cost
su bcrypt e un valore di sale predefinito.
Password_Verify accetta una password e un hash esistente. Quindi re-hash la password (identica a $tmp = crypt($password, $hash)
). Quindi, utilizza una funzione di confronto a tempo costante per determinare se i due hash sono effettivamente uguali.
Password_Make_Salt esiste per generare una stringa casuale della lunghezza specificata. Se raw_output
è impostato su false (predefinito), l'output "salt" sarà codificato in base64 in un modo che è direttamente compatibile con crypt()
. Se raw_output
è true, restituirà la stessa stringa di lunghezza usando full-byte casuali ( 0-255
).
Esempio:
$hash = password_hash("foo");
if (password_verify("foo", $hash)) {
// always should be true
} else {
}
Una nota sulla lettura del codice sorgente di PHP: le funzioni PHP (quelle esposte al codice php) sono circondate dalla macro PHP_FUNCTION()
. Inoltre, le variabili PHP (zval) vengono utilizzate in alcuni punti. Le macro che accedono a parti di esse sono
-
Z_TYPE_P()
(trovare il tipo di puntatore a zval) -
Z_STRVAL_P()
(ottieni il puntatore al valore stringa) -
Z_STRLEN_P()
(ottieni laint
lunghezza del tipo di stringa) -
Z_LVAL_P()
(ottieni il valorelong
del tipo intero)
Inoltre, zval_ptr_dtor()
è un meccanismo refcount per ridurre il Refcount su zval
, e pulirlo se colpisce 0
.
Sto cercando una revisione dell'attuazione da parte di almeno alcuni esperti di sicurezza prima di proporre ufficialmente il cambiamento. È ragionevolmente breve (solo circa 300 righe di codice) ...
Aggiornamento
L'API è stata approvata, quindi ho impostato una richiesta di pull per la funzionalità. Si prega di rivederlo se avete tempo. Grazie !: link