Смена пароля с помощью CakePHP и Blowfish

Я пытаюсь настроить форму, чтобы пользователь мог изменить свой пароль с помощью CakePHP 2.3. Используемый алгоритм – это иглобрюх. У меня есть следующие три поля:

<?php echo $this->Form->input('old_password', array('type' => 'password', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('new_password', array('type' => 'password', 'autocomplete' => 'off')); ?>
<?php echo $this->Form->input('new_password_confirm', array('type' => 'password', 'autocomplete' => 'off', 'label' => 'Confirm Password')); ?>

Вот код, в котором я пытаюсь убедиться, что они правильно ввели свой старый пароль:

$hash = Security::hash($this->request->data['User']['old_password'], 'blowfish');
$correct = $this->User->find('first', array(
    'conditions' => array(
        'User.id' => AuthComponent::user('id'),
        'User.password' => $hash
    ),
    'fields' => array('id')
));

Проблема в том, что даже если я правильно ввожу старый пароль, Cake никогда не находит пользователя, потому что он, похоже, не вычисляет правильный хэш. Каждый раз, когда я отправляю форму с одним и тем же старым паролем, Cake каждый раз генерирует новый хэш. Вероятно, это связано с тем, что я не понимаю, как работает алгоритм blowfish/bcrypt, но я не могу понять это.

Что мне здесь не хватает?


person Hoff    schedule 22.06.2013    source источник


Ответы (1)


Работа с хэшами Blowfish отличается от работы с другими типами хэшей. Из документации API метода хеширования:

Сравнение хэшей: просто передайте исходный хешированный пароль в качестве соли.

Это означает, что в вашем случае вам сначала нужно получить хешированный пароль для конкретного пользователя, а затем использовать его в качестве соли. Что-то типа

$user = $this->User->find('first', array(
  'conditions' => array(
    'User.id' => AuthComponent::user('id')
  ),
  'fields' => array('password')
));
$storedHash = $user['User']['password'];
$newHash = Security::hash($this->request->data['User']['old_password'], 'blowfish', $storedHash);
$correct = $storedHash == $newHash;
person dhofstet    schedule 22.06.2013
comment
Лучше бы так: $correct = strcmp($storedHash, $newHash) == 0 - person Mirko Pagliai; 19.08.2014
comment
@MirkoPagliai, почему так лучше? - person erjiang; 08.09.2016
comment
@MirkoPagliai Не лучше ли вместо этого использовать ===? Не уверен, где в вашей ссылке ответ, почему предпочтительнее использовать strcmp. - person erjiang; 12.09.2016