2015-04-07 29 views
6

Tôi có mật khẩu được lưu trữ tại database được băm với DefaultPasswordHasher tại hành động add.DefaultPasswordHasher tạo băm khác nhau cho cùng một giá trị

Tôi có một hành động khác để thay đổi mật khẩu cho người dùng đã đăng nhập, trên biểu mẫu này Tôi có một trường được gọi là current_password mà tôi cần so sánh với giá trị mật khẩu hiện tại từ database.

Vấn đề là DefaultPasswordHasher tạo ra một mã băm khác nhau cho mỗi lần tôi băm giá trị của biểu mẫu để điều này sẽ không bao giờ khớp với băm từ cơ sở dữ liệu.

theo mã xác nhận của trường '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

Đây có lẽ là "muối"; đó là một điều tốt, bởi vì nó có nghĩa là bạn không thể nhìn vào cơ sở dữ liệu và tìm thấy tất cả những người có mật khẩu là "mật khẩu". Bạn cần phải xác minh mật khẩu đối với hàm băm bằng hàm thích hợp, không so sánh hàm băm cũ với hàm băm mới. – IMSoP

+0

Như @IMSoP đã nói, hãy xem ** http: //api.cakephp.org/3.0/class-Cake.Auth.DefaultPasswordHasher.html#_check** – ndm

Trả lời

12

Đó là cách bcrypt công trình. Bcrypt là một thuật toán băm mật khẩu mạnh hơn sẽ tạo ra các hash khác nhau cho cùng một giá trị tùy thuộc vào entropy của hệ thống hiện tại, nhưng có thể so sánh nếu chuỗi ban đầu có thể được băm thành mật khẩu đã băm.

Để giải quyết vấn đề của bạn sử dụng check() chức năng thay vì hash() chức năng:

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

hoạt động hoàn hảo –

+0

Không chắc chắn điều này cụ thể đối với bcrypt - bất kỳ băm nào có thể được lưu trữ với một muối sẽ khác nếu bạn tái tạo nó. Nhưng giải thích và giải pháp là nếu không chính xác. – IMSoP

+0

bạn là đúng @IMSoP, hàm password_hash() chỉ tạo ra một muối khác nhau mỗi lần, do đó có nghĩa là một hàm băm khác nhau. –

Các vấn đề liên quan