2014-09-30 7 views
6

È stato discusso qui prima, ma sembra non esserci alcuna conclusione.Aggiornamento hash della password da md5 a bcrypt

Idealmente, non si vuole mantenere lo stato (aggiornato/non aggiornato) nel database, ecc così, ecco che cosa sto pensando:

bcrypt la password MD5'd, e usare "nome utente + qualcos'altro "come un sale.

  1. Questo schema ha senso?
  2. Inoltre, in generale è una buona idea usare il nome utente come parte del sale? Ho letto da qualche parte che aggiungere un sale diverso a ciascun hash lo rende più sicuro. È corretto (specialmente nel contesto di bcrypt)?
+0

Si prega di spiegare il downvote – merlinbeard

+4

Questa sarebbe una soluzione migliore su [security.se], ma controllate il loro centro assistenza prima di postare. –

+0

Controlla 'password_hash()' http://php.net/manual/en/function.password-hash.php – timgavin

risposta

6

Sicuramente è una buona idea passare a un algoritmo hash più sicuro. C'è una funzione password_hash() è possibile utilizzare per la creazione di un hash bcrypt:

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

Dalla tua risposta credo che si è utilizzato un valore MD5 non salato, in modo doppio hashing può essere una buona soluzione qui. Basta passare l'hash MD5 alla funzione password_hash(), genererà un sale sicuro da solo.

// Migrating the old MD5 hashes to MD5-BCrypt 
$hashToStoreInDb = password_hash($existingMd5Hash, PASSWORD_DEFAULT); 

Per la verifica prima check for a double hash, e quindi verificare la password di conseguenza.

if (checkIfDoubleHash($existingHashFromDb)) 
{ 
    $isPasswordCorrect = password_verify(MD5($password), $existingHashFromDb); 

    // Update database with pure BCrypt hash 
    if ($isPasswordCorrect) 
    $hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT); 
} 
else 
{ 
    $isPasswordCorrect = password_verify($password, $existingHashFromDb) 
} 

Gli hash memorizzati possono essere riconosciuti dal leader $ o da un campo db separata, un hash bcrypt per esempio inizia sempre con un carattere $, un hash MD5 non lo fa.

Un sale dovrebbe non essere trascurato da altri parametri e dovrebbe essere univoco per password. La funzione password_hash() si prenderà cura di questo. Poiché un arcobaleno deve essere costruito prima di ogni sale, un attaccante dovrebbe costruire un arcobaleno per ogni password. Per ulteriori informazioni è possibile dare un'occhiata al mio tutorial su secure password storing.

+0

Questo è utile. Grazie! – merlinbeard