2013-07-18 8 views
5

Sto usando bcrypt per generare sali e password di hash, ma non penso che lo stia facendo in modo molto sicuro. Quando uso il seguente codice:Bcrypt non è sicuro alle password di hashing?

bcrypt.genSalt(10, function(err, salt) { 
    user.salt = salt; 
    bcrypt.hash(password, salt, function(err, hash) { 
    user.hashed_password = hash; 
    console.log(user.salt); 
    console.log(user.hashed_password); 
    user.save(function(err) { 
     if (err) console.log(err); 
     console.log("saved"); 
    }); 
    }); 
}); 

In un esempio, il sale è: $2a$10$mFFjRpY1Vrq7Fy1fFp0fMO e il hashed_password è: $2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

L'inizio della password hash è esattamente lo stesso come il sale. Se un utente malintenzionato ha accesso a Salt, non può semplicemente rimuovere il sale dalla hashed_password e la forza bruta o utilizzare una tabella di valori hash predefiniti per determinare la password?

Ho sempre pensato che questo dovrebbe essere l'ordine di hashing una password:

hash(salt + password) 
Non

:

salt + hash(password) 

risposta

17

L'inizio della password hash è il sale perché si necessità accesso al sale per verificare la password.

I dati che si vede non è né di hash (sale + password), né sale + hash (password) - è di forma

salt + hash(salt + password) 

Se un malintenzionato accede a questi dati, quindi:

  • Ovviamente possono (in teoria) forzare la password - nessuna tecnica può impedirlo, ma la limitazione della velocità rende l'attacco poco pratico. La funzione di hash utilizzata in questa istanza è specificamente progettata per richiedere molto tempo per essere eseguita, in modo indiretto per valutare la limitazione dell'attacco.
  • Loro non possono utilizzare una tabella standard di hash per trovare la password, poiché il valore hash contiene anche il sale univoco. Ovviamente il sale è in chiaro in modo da poter calcolare un tavolo, ma poiché il sale è unico per ogni password con hash, non è meglio di un attacco di forza bruta.