PHP Creazione di un hash della password


Esempio

Crea hash delle password usando password_hash() per utilizzare l'attuale hash standard di best practice del settore o la derivazione della chiave. Al momento della stesura, lo standard è bcrypt , il che significa che PASSWORD_DEFAULT contiene lo stesso valore di PASSWORD_BCRYPT .

$options = [
    'cost' => 12,
];

$hashedPassword = password_hash($plaintextPassword, PASSWORD_DEFAULT, $options);

Il terzo parametro non è obbligatorio .

Il valore 'cost' dovrebbe essere scelto in base all'hardware del server di produzione. Aumentandolo si renderà la password più costosa da generare. Più è costoso generare più tempo ci vorrà chiunque cerchi di craccarlo per generarlo anche. Il costo dovrebbe idealmente essere il più alto possibile, ma in pratica dovrebbe essere impostato in modo che non rallenti troppo. Da qualche parte tra 0,1 e 0,4 secondi andrebbe bene. Usa il valore predefinito in caso di dubbio.

5.5

Su PHP inferiore a 5.5.0 le funzioni password_* non sono disponibili. È necessario utilizzare il pacchetto di compatibilità per sostituire tali funzioni. Si noti che il pacchetto di compatibilità richiede PHP 5.3.7 o versioni successive o una versione con backport di $2y (come ad esempio RedHat).

Se non si è in grado di utilizzarli, è possibile implementare l'hashing della password con crypt() Poiché password_hash() è implementata come wrapper attorno alla funzione crypt() , non è necessario perdere alcuna funzionalità.

// this is a simple implementation of a bcrypt hash otherwise compatible
// with `password_hash()`
// not guaranteed to maintain the same cryptographic strength of the full `password_hash()`
// implementation

// if `CRYPT_BLOWFISH` is 1, that means bcrypt (which uses blowfish) is available
// on your system
if (CRYPT_BLOWFISH == 1) {
    $salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM);
    $salt = base64_encode($salt);
    // crypt uses a modified base64 variant
    $source = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
    $dest = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    $salt = strtr(rtrim($salt, '='), $source, $dest);
    $salt = substr($salt, 0, 22);
    // `crypt()` determines which hashing algorithm to use by the form of the salt string
    // that is passed in
    $hashedPassword = crypt($plaintextPassword, '$2y$10$'.$salt.'$');
}

Salt per l'hash della password

Nonostante l'affidabilità dell'algoritmo di crypt, esiste ancora una vulnerabilità nei confronti delle tabelle arcobaleno . Questa è la ragione, perché è consigliabile usare il sale .

Un salt è qualcosa che viene aggiunto alla password prima dell'hashing per rendere la stringa di origine univoca. Con due password identiche, gli hash risultanti saranno anche unici, poiché i loro sali sono unici.

Un sale casuale è uno dei pezzi più importanti della sicurezza della tua password. Ciò significa che anche con una tabella di ricerca di hash di password noti, un utente malintenzionato non può abbinare l'hash della password dell'utente con gli hash delle password del database poiché è stata utilizzata una sequenza casuale. Dovresti usare sempre sali casuali e crittograficamente sicuri. Leggi di più

Con l'algoritmo bcrypt password_hash() , il testo semplice sale viene archiviato insieme all'hash risultante, il che significa che l'hash può essere trasferito su diversi sistemi e piattaforme e deve ancora essere abbinato alla password originale.

7.0

Anche quando questo è scoraggiato, puoi usare l'opzione salt per definire il tuo sale casuale.

 $options = [
        'salt' => $salt, //see example below
 ];

Importante Se si omette questa opzione, verrà generato un salt casuale da password_hash () per ogni hash della password. Questa è la modalità di funzionamento prevista.

7.0

L'opzione salt è stata deprecata a partire da PHP 7.0.0. Ora è preferibile utilizzare semplicemente il sale che viene generato di default.