2015-04-07 20 views
6

add eyleminde DefaultPasswordHasher hashed ile database hashed'de saklanan bir parolam var.DefaultPasswordHasher aynı değer için farklı karma üretiyor

Oturum açmış olan kullanıcının parolasını değiştirmek için başka bir işlem yapıyorum, bu formda current_password adı verilen bir alanım var. database geçerli parola değeriyle karşılaştırmam gerekiyor.

Sorun, DefaultPasswordHasher'un her zaman için, formun değerini yazdığım her zaman için farklı bir özet üretmesidir, bu hiçbir zaman veritabanından karma ile eşleşmeyecektir.

->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

; Bu iyi bir şey, çünkü veritabanına bakıp parola "parola" olan tüm insanları bulamıyorsunuz demektir. Şifreyi ilgili işleve sahip karma ile doğrulamanız gerekir, eski hash ile yeni karşılaştırılamaz. – IMSoP

+0

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

cevap

12

eser bcrypt yoludur:

'current_password' alanının doğrulama kodunu izleyin. Bcrypt, geçerli sistem entropisine bağlı olarak aynı değer için farklı karmalar üretecek daha güçlü bir parola karma algoritmasıdır, ancak orijinal dizgenin zaten karma bir şifreye sahip olup olmadığını karşılaştırabilmektedir.

senin sorunun yerine hash() fonksiyonun check() işlevini kullanın çözmek için: Bu "tuz" muhtemelen

->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

mükemmel çalışıyor –

+0

Bunun bcrypt'e özgü olduğundan emin değilsiniz - herhangi bir karma olabilir yenileyecekseniz farklı olacak bir tuz ile saklanır. Fakat açıklama ve çözüm başka türlü doğrudur. – IMSoP

+0

haklısınız @IMSoP, password_hash() işlevi her seferinde farklı bir tuz üretir, bu yüzden farklı bir karma anlamına gelir. –

İlgili konular