2015-04-07 9 views
6

Ho una password memorizzata a database hash con azione DefaultPasswordHasher a add.DefaultPasswordHasher che genera hash diversi per lo stesso valore

Ho un'altra azione per modificare la password per l'utente che ha effettuato l'accesso, in questo modulo ho un campo chiamato current_password che ho bisogno di confrontare con il valore della password corrente da database.

Il problema è che DefaultPasswordHasher sta generando un hash diverso per ogni volta che sto tagliando il valore del modulo in modo che questo non possa mai corrispondere con l'hash dal database.

seguire il codice di validazione del campo 'current_password':

->add('current_password', 'custom', [ 
     'rule' => function($value, $context){ 
      $user = $this->get($context['data']['id']); 
      if ($user) { 
       echo $user->password; // Current password value hashed from database 
       echo '<br>'; 
       echo $value; //foo 
       echo '<br>'; 
       echo (new DefaultPasswordHasher)->hash($value); // Here is displaying a different hash each time that I post the form 

       // Here will never match =[ 
       if ($user->password == (new DefaultPasswordHasher)->hash($value)) { 
        return true; 
       } 
      } 
      return false; 
     }, 
     'message' => 'Você não confirmou a sua senha atual corretamente' 
    ]) 
+0

Questo è probabilmente "sale"; è una buona cosa, perché significa che non puoi guardare nel database e trovare tutte le persone la cui password è "password". È necessario verificare la password rispetto all'hash con la funzione appropriata, non confrontare il vecchio hash con il nuovo. – IMSoP

+0

Come detto @IMSoP, vedere ** http: //api.cakephp.org/3.0/class-Cake.Auth.DefaultPasswordHasher.html#_check** – ndm

risposta

12

Questo è il modo bcrypt opere. Bcrypt è un algoritmo di hashing della password più potente che genererà hash diversi per lo stesso valore a seconda dell'entropia del sistema corrente, ma che è in grado di confrontare se la stringa originale può essere sottoposta a hashing a una password già hash.

Per risolvere il problema, utilizzare la funzione anziché la funzione hash()check():

->add('current_password', 'custom', [ 
     'rule' => function($value, $context){ 
      $user = $this->get($context['data']['id']); 
      if ($user) { 
       if ((new DefaultPasswordHasher)->check($value, $user->password)) { 
        return true; 
       } 
      } 
      return false; 
     }, 
     'message' => 'Você não confirmou a sua senha atual corretamente' 
+0

funziona perfettamente –

+0

Non è sicuro che questo sia specifico per bcrypt - qualsiasi hash può essere immagazzinato con un sale che sarà diverso se lo rigenererai. Ma la spiegazione e la soluzione sono altrimenti corrette. – IMSoP

+0

hai ragione @IMSoP, la funzione password_hash() genera semplicemente un sale diverso ogni volta, quindi significa un hash diverso. –